16

我有一个网址:

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

如何获得斜线之间的最后一个术语?即last使用正则表达式?

请注意,该 URL 可能只是:

www.domain.com/last/ 

或者:

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

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

更新

在实现了一些答案之后,我刚刚意识到我需要只在某个目录中的 URL 上进行这种匹配。

IE

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

应该返回last。然而:

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

不应返回匹配项。

4

4 回答 4

38

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

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

应该匹配你扔给它的任何东西。


如果要查看特定目录,请使用以下命令:

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

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

于 2012-01-10T03:29:37.913 回答
11

这个正则表达式(约瑟夫答案的略微修改版本)应该给你最后一段,减去结束斜线。

([^/]+)/?$

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

于 2012-01-10T03:45:11.227 回答
3

这应该可以解决问题:

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

使用 a(?=lookahead)你不会得到最后一个斜线。

[^/]+ 查找至少一个不是斜线的字符(尽可能多)。 (?=/?^|^)确保字符串的下一部分是 /,然后是字符串的结尾或只是字符串的结尾。

匹配match, /one/two/match'/one/two/match/'。

于 2012-01-10T03:44:01.947 回答
0

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

像这样的东西怎么样:

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

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

我以正则表达式结尾,/?这意味着字符串的末尾可能有也可能没有斜杠。我把正则表达式放在m|and之间|,所以我可以使用正斜杠,而不必经常转义它们。

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

于 2012-01-10T04:26:11.053 回答