我似乎无法弄清楚如何匹配以下
字符串/hello/there-my-friend
中的
我需要在最后/
之后和最后-
所以它应该捕获there-my
。
答案 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+
(更便携)
\K
接近(?<=/)
:look-around regex advanced technique \w
与[a-zA-Z0-9_]
相同,请随时调整答案 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 `-`
评论后编辑:不再包含结果中的/
和最后-
。