如何使用正则表达式获取URL的最后一段

17

我有一个URL:

www.domain.com/first/second/last/

如何使用正则表达式获取斜杠之间的最后一个术语?例如,获取last

请注意,URL 可能仅为:

www.domain.com/last/ 

或者:

www.domain.com/first/second/third/fourth/last/

我需要提取最后一个术语,以便在 Zeus 服务器的请求重写模块中使用 PERL 和 REGEX。

更新

实施一些答案后,我刚刚意识到我需要仅对某个目录中的 URL 进行匹配。

例如:

www.domain.com/directory/first/second/last/ 

应该返回last。然而:

www.domain.com/first/second/last/ 

不应该返回匹配项。

4个回答

43

这是一个简单的正则表达式:

[^/]+(?=/$|$)

它应该能够匹配你提供的任何内容。


如果你想在特定目录中查找,请使用以下代码:

/directory.*/([^/]+)/?$

你的结果将在第一个捕获组中。


谢谢!这个可行。但我刚意识到,我需要提取特定目录下仅有的URLS的最后一段。例如www.domain.com/directory/first/second/last/你能再提供一些建议吗?谢谢。 - Matt
@Matt - 我现在在 RegexBuddy 中看到了,PERL 不支持在 lookbehind 中使用变量重复。除非你想使用捕获组,否则你必须单独检查它是否在特定目录内。 - Joseph Silber
/directory/.*([^/]+)/?$ 只返回最后一个字符,即“t”,而不是“last”。 - Matt
2
这不适用于查询字符串(它会捕获查询字符串)https://regex101.com/r/Oo3Wk7/1 - Anthony Mastrean

12

这个正则表达式(稍微修改了Joseph的答案),应该可以给你最后一个段落,去掉结尾的斜杠。

([^/]+)/?$

你的结果将是第一个捕获组。


对于寻找RE2兼容解决方案(Go,Google Sheets)的人,这个解决方案适合我。 - Ian Hyzy

4
这应该能解决问题:
[^/]+(?=/$|$)

(?=lookahead) 能够匹配到最后一个斜杠。

[^/]+ 匹配至少一个非斜杠字符(尽可能多)。 (?=/?^|^) 确保字符串的下一部分是 /,然后是字符串的末尾或仅仅是字符串的末尾。

/one/two/match 和 '/one/two/match/' 中匹配 match


0

最后的斜杠可能是可选的。对吧?

这样怎么样:

$url =~ m|([^/]+)/?$|;
my $end_of_url = $1;

$符号用于将正则表达式锚定到字符串的末尾。 [^/]表示任何不是斜杠的字符,后面的+表示我想要一个或多个不是斜杠的字符。请注意,这是在捕获组中,用括号标记。

我用/?结束正则表达式,这意味着字符串的最后可能有也可能没有斜杠。我将我的正则表达式放在m||之间,因此我可以使用正斜杠而无需不断转义它们。

现在URL的最后一部分在$1中,我可以设置自己的标量变量来保存此结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接