需要一个正则表达式将文本从最后一个“/”返回到最后一个“ - ”

时间:2013-03-20 22:44:57

标签: regex

我似乎无法弄清楚如何匹配以下

字符串/hello/there-my-friend

中的

我需要在最后/之后和最后-

之前捕捉所有内容

所以它应该捕获there-my

5 个答案:

答案 0 :(得分:2)

这是您正在寻找的正则表达式:

#(?<=/)[^/]+(?=-[^-/]*$)#

我会在一分钟内将其分解,但可能有更好的方法来做到这一点。

我可能会这样做:

$str = "/hello/there-my-friend";
$pieces = explode('/', $str);
$afterLastSlash = $pieces[count($pieces)-1];
$dashes = explode('-', $afterLastSlash);
unset($dashes[count($dashes)-1]);
$result = implode('-', $dashes);

这里的性能是保证线性的(限制因素是$ str的长度加上$ afterLastSlash的长度。正则表达式会慢得多(多数时间,我认为 - 它可能会有点冒险)有外观。)

上面的代码很容易被削减,但命名使其更清晰。这是一个班轮:

$result = implode('-', array_slice(explode('-', array_slice(explode('/', $str), -1)), 0, -1));

但总的来说,不要这样做。找个中间地带。

正如所承诺的,正则表达式的细分:

#
    (?<=        Look behind an ensure there's a...
        /       Literal forward slash.
    )           Okay, done looking behind.
    [^/]        Match any character that's not a forward slash
    +           ...One ore more times.
    (?=         Now look ahead, and ensure there's...
        -       a hyphen.
        [^-/]   followed by any non-hyphen, non-forward slash character
        *       zero or more times
        $       until the end of the string.
     )          Okay, done looking ahead.
#

答案 1 :(得分:1)

^".*/([^/-]*)-[^/-]*$

语法可能会因您使用的RE风格而异。

答案 2 :(得分:1)

试试这个简短的正则表达式:

/\K\w+-\w+

您的正则表达式引擎需要\K support

(?<=/)\w+-\w+

(更便携)

说明

答案 3 :(得分:0)

这不是你问题的准确答案(它不是正则表达式),但是如果你使用的是C#,你可以使用它:

string str = "/hello/there-my-friend";
int lastSlashIndex = str.LastIndexOf('/');
int lastDashIndex = str.LastIndexOf('-');

return str.Substring(lastSlashIndex, lastDashIndex - lastSlashIndex);

答案 4 :(得分:0)

这样做:

(?!.*?/).*(?=-)

根据您的语言,您可能需要转义/

故障:

1. (?!.*?/) - Negative look ahead. It will start collecting characters after the last `/`
2. .*       - Looks for all characters
3. (?=-)    - Positive look ahead. It means step 2 should only go up to the last `-`

评论后编辑:不再包含结果中的/和最后-