如何使用正则表达式获取 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 的最后一段的主要内容,如果未能解决你的问题,请参考以下文章

如何使用正则表达式从 html 字符串中获取图像 url

javascript 如何使用Javascript正则表达式获取URL参数

如何使用正则表达式验证捕获组中的最后一个字符

正则表达式:替换网址的最后一段

如何使用 Java 中的正则表达式从 YouTube URL 获取视频 ID

正则表达式获取URL参数