3

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

在字符串中/hello/there-my-friend

我需要在最后一个之后和最后一个/之前捕获所有内容-

所以它应该捕获there-my.

4

5 回答 5

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.
#
于 2013-03-20T22:50:55.287 回答
1

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

/\K\w+-\w+

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

或者

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

(更便携)

解释

于 2013-03-20T22:57:00.193 回答
1
^".*/([^/-]*)-[^/-]*$

语法可能会有所不同,具体取决于您使用的 RE 风格。

于 2013-03-20T22:53:13.693 回答
0

这不是您问题的确切答案(它不是正则表达式),但如果您使用的是 C#,您可能会使用它:

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

return str.Substring(lastSlashIndex, lastDashIndex - lastSlashIndex);
于 2013-03-20T23:01:22.567 回答
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 `-`

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

于 2013-03-20T23:04:27.360 回答