如何使用正则表达式获取 URL 的最后一段
Posted
技术标签:
【中文标题】如何使用正则表达式获取 URL 的最后一段【英文标题】:How do I get the last segment of URL using regular expressions 【发布时间】:2012-02-06 13:32:42 【问题描述】:我有一个网址:
www.domain.com/first/second/last/
如何获得斜线之间的最后一个术语?即last
使用正则表达式?
请注意,网址可能只是:
www.domain.com/last/
或者:
www.domain.com/first/second/third/fourth/last/
我需要提取最后一个术语,以便在使用 PERL 和 REGEX 的 Zeus 服务器的请求重写模块中使用。
更新
在实现了一些答案之后,我才意识到我只需要在某个目录中的 URL 上进行这种匹配。
即
www.domain.com/directory/first/second/last/
应该返回last
。鉴于:
www.domain.com/first/second/last/
不应返回匹配项。
【问题讨论】:
【参考方案1】:这是一个简单的正则表达式:
[^/]+(?=/$|$)
应该匹配你扔给它的任何东西。
如果要查看特定目录,请使用:
/directory.*/([^/]+)/?$
您的结果将在第一个捕获组中。
【讨论】:
谢谢!这行得通。但我刚刚意识到我需要提取仅在特定目录中的 URL 的最后一段。即 www.domain.com/directory/first/second/last/ 你能提出进一步的建议吗?谢谢。 @Matt - 我现在(在 RegexBuddy 中)看到 PERL does not support variable repetition inside lookbehind。您必须单独检查它是否在该特定目录中 - 除非您想使用捕获组。 /directory/.*([^/]+)/?$ 只返回最后一个字符,即't'而不是'last 这不适用于查询字符串(它捕获查询字符串)regex101.com/r/Oo3Wk7/1【参考方案2】:这个正则表达式(约瑟夫回答的略微修改版本)应该给你最后一段,减去结束斜线。
([^/]+)/?$
您的结果将是第一个捕获组。
【讨论】:
对于寻找与 RE2 兼容的解决方案(Go、Google Sheets)的人来说,这个对我有用。【参考方案3】:这应该可以解决问题:
[^/]+(?=/$|$)
(?=lookahead)
不会得到最后一个斜线。
[^/]+
查找至少一个不是斜杠的字符(尽可能多)。
(?=/?^|^)
确保字符串的下一部分是 /,然后是字符串的结尾或只是字符串的结尾。
在/one/two/match
中匹配match
,'/one/two/match/'。
【讨论】:
【参考方案4】:最后一个斜杠可能是可选的。对吧?
这样的事情怎么样:
$url =~ m|([^/]+)/?$|;
my $end_of_url = $1;
末尾的$
将正则表达式锚定到字符串的末尾。 [^/]
表示任何不是斜线的东西,+
after 表示我想要一个或多个不是斜线的东西。请注意,这是在一个用括号标记的捕获组中。
我以/?
结束正则表达式,这意味着字符串的末尾可能有也可能没有斜杠。我将正则表达式放在了m|
和|
之间,所以我可以使用正斜杠而不必经常转义它们。
URL 的最后一部分现在位于 $1
中,我可以设置自己的标量变量来保存此结果。
【讨论】:
以上是关于如何使用正则表达式获取 URL 的最后一段的主要内容,如果未能解决你的问题,请参考以下文章
javascript 如何使用Javascript正则表达式获取URL参数