我似乎无法弄清楚如何匹配以下内容
在字符串中/hello/there-my-friend
我需要在最后一个之后和最后一个/
之前捕获所有内容-
所以它应该捕获there-my
.
这是您要查找的正则表达式:
#(?<=/)[^/]+(?=-[^-/]*$)#
我会在一分钟内分解它,但可能有更好的方法来做到这一点。
我可能会做这样的事情:
$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.
#
试试这个简短的正则表达式:
/\K\w+-\w+
您的正则表达式引擎需要\K
支持
或者
(?<=/)\w+-\w+
(更便携)
\K
接近于(?<=/)
:环视正则表达式高级技术\w
是一样的[a-zA-Z0-9_]
,随意调整^".*/([^/-]*)-[^/-]*$
语法可能会有所不同,具体取决于您使用的 RE 风格。
这不是您问题的确切答案(它不是正则表达式),但如果您使用的是 C#,您可能会使用它:
string str = "/hello/there-my-friend";
int lastSlashIndex = str.LastIndexOf('/');
int lastDashIndex = str.LastIndexOf('-');
return str.Substring(lastSlashIndex, lastDashIndex - lastSlashIndex);
这将做到:
(?!.*?/).*(?=-)
根据您的语言,您可能需要转义/
分解:
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 -
。