正则表达式:收集最后一个 / 后面的所有内容

73

我刚开始学习正则表达式,想知道如何编写一个表达式来收集最后一个 / 后面的所有内容。

我正在提取 Google 的 GData 中使用的 ID。

我的示例字符串为:

http://spreadsheets.google.com/feeds/spreadsheets/p1f3JYcCu_cb0i0JYuCu123

标识符是:p1f3JYcCu_cb0i0JYuCu123

哦,我在使用 PHP。

8个回答

136

这个模式至少匹配一个字符(不能是斜杠),并且紧随字符串结尾:

[^/]+$


注意:

  • 不需要括号,因为它不需要任何组 - 结果进入组0(即匹配本身)。
  • 使用+(而不是*),因此如果最后一个字符是斜杠,则无法匹配(而不是匹配空字符串)。


但是,最可能更快且更简单的解决方案是使用您所使用的编程语言内置的字符串列表处理功能,例如 ListLast( Text , '/' ) 或等效函数。

对于PHP,最接近的功能是strrchr,其工作原理如下:

strrchr( Text , '/' )

这将包括结果中的斜杠 - 根据Teddy在下面的评论中所说,您可以使用substr删除斜杠:


这包括结果中的斜杠-根据Teddy在下面的评论中提到,你可以使用substr函数去掉斜杠:
substr( strrchr( Text, '/' ), 1 );

7
使用非正则表达式的解决方案值得点赞。截取子字符串比导入正则表达式支持更快,而且可以避免使用正则表达式。 - Jonathon Watney
1
感谢您的帮助,我现在对正则表达式有了更好的理解。PHP 代码如下。preg_match('([^/]+$)', "http://spreadsheets.google.com/feeds/spreadsheets/p1f3JYcCu_cb0i0JYuCu124", $matches) - Hellonearthis
1
如果你想去掉“/”符号,可以这样做:substr(strrchr(Text, '/'), 1); - Teddy Zetterlund
有人可以解释一下为什么这个正则表达式抓取的是最后一个斜杠后面的所有内容而不是第一个,因为使用了^吗? - CodeCrack
[^/]+$ 实际上是错误的。/ 是一个分隔符,你应该转义它:[^\/]+$ - Thielicious
显示剩余4条评论

22

一般而言:

/([^/]*)$
你需要的数据将会是第一个匹配组的结果。
编辑  如果你正在使用PHP,你也可以使用strrchr函数,它返回字符串中指定字符最后出现位置到结尾的所有字符。或者你可以使用strrpossubstr的组合,先找到最后出现位置再获取该位置到结尾的子字符串。或者使用explodearray_pop,将字符串以/为分隔符划分成数组,然后获取最后一个元素。

4
根据你使用的语言,你可能需要在字符类中转义斜杠。 /([^\/]*$/ - rampion
@rasjani:这取决于语言,如果你可以像我写的那样使用正则表达式。有些语言有用于正则表达式的语法字面量(例如Perl的/…/),其他语言有类来从字符串构建正则表达式(例如Java),而其他语言则只使用字符串(例如PHP)。但总的来说,我的正则表达式是正确的。 - Gumbo
这也会匹配“/”,这意味着您的组将为空,即空ID。如果您不希望这种情况,请考虑使用/([^ /] +)$。 - Jonathon Watney
谢谢Gumbo,那对我也有很大帮助。在PHP中有许多不同的方法来完成任务。 - Hellonearthis

13
你还可以使用basename函数来获取“文件名”或最后一部分。
<?php
$url = 'http://spreadsheets.google.com/feeds/spreadsheets/p1f3JYcCu_cb0i0JYuCu123';

echo basename($url); // "p1f3JYcCu_cb0i0JYuCu123"

在我的盒子上,我只需要传递完整的URL。可能你需要从前面去掉http:/
Basename和dirname非常适用于处理类似Unix文件路径的任何内容。

11
/^.*\/(.*)$/

^表示行首

.*\/表示从行首到最后一个/之间的最长匹配字符串

(.*)表示/后面的所有内容作为一个组


3

你也可以使用普通字符串分割

$str = "http://spreadsheets.google.com/feeds/spreadsheets/p1f3JYcCu_cb0i0JYuCu123";
$s = explode("/",$str);
print end($s);

2
这个模式不会捕获$0中的最后一个斜杠,并且如果最后一个斜杠后面没有字符,则不会匹配任何内容。
/(?<=\/)([^\/]+)$/

编辑:但它需要使用前瞻,而 ECMAScript(Javascript,Actionscript),Ruby 或其他某些语言不支持。如果您正在使用其中一种语言,可以使用以下方法:
/\/([^\/]+)$/

但它会捕获$0中的最后一个斜杠。

ruby19 支持后顾断言。 - rampion

1

虽然我不是PHP程序员,但strrpos似乎是一个更有前途的起点。找到最右边的'/',并且它后面的所有内容就是你要找的。没有使用正则表达式。

在字符串中查找字符的最后一次出现位置


我曾经考虑过那样做,但新的 preg_match 可以实现它。 我相信有比我最终采取的方法更好的方法来完成事情。 - Hellonearthis

0

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