正则表达式 - 获取URL中最后一个斜杠后的所有字符

65

我正在使用谷歌API,该API返回以下格式的ID,我已将其保存为字符串。如何在JavaScript中编写正则表达式以仅截取URL中最后一个斜杠之后的字符。

var id = 'http://www.google.com/m8/feeds/contacts/myemail%40gmail.com/base/nabb80191e23b7d9'
8个回答

111
不要写正则表达式!这个用字符串函数来做非常简单:
var final = id.substring(id.lastIndexOf('/') + 1);

如果你知道最后一部分总是16个字符,那就更容易了。

var final = id.substring(id.length - 16);

1
如果URL是“http://www.google.com/m8/feeds/contacts/myemail%40gmail.com/base/nabb80191e23b7d9/”,则不会返回任何内容。 - Allan Kimmer Jensen
12
好的,我会尽力进行翻译。这句话的意思是,在最后一个斜杠后面没有任何东西。 - lonesomeday
3
我虽然在寻找PHP解决方案,但我发现了这个主题。如果有人感兴趣,我进行了转换:substr($id, strrpos($id, "/") + 1)。该代码意思为获取 $id 中最后一个斜杠后的所有字符(不包括斜杠)。 - Jan
1
为什么这个问题会被这么多人点赞?当你在谷歌上搜索正则表达式解决方案时,它会显示在第一个问题上。OP明确要求使用正则表达式,然而回答却以“不要编写正则表达式”开始 : ( - Mercury
1
@Mercury 因为这是明智的建议吗?“我如何用大键琴把钉子敲进墙里?”“不要:使用锤子。” - lonesomeday
显示剩余4条评论

56

稍微不同的正则表达式方法:

var afterSlashChars = id.match(/\/([^\/]+)\/?$/)[1];

分解这个正则表达式:

\/ match a slash
(  start of a captured group within the match
[^\/] match a non-slash character
+ match one of more of the non-slash characters
)  end of the captured group
\/? allow one optional / at the end of the string
$  match to the end of the string
[1] 然后检索匹配中的第一个捕获组。

var id = 'http://www.google.com/m8/feeds/contacts/myemail%40gmail.com/base/nabb80191e23b7d9';

var afterSlashChars = id.match(/\/([^\/]+)\/?$/)[1];

// display result
document.write(afterSlashChars);


解释会让你的答案比被接受的更有价值。谢谢! - Ilia
@IliaRostovtsev:不幸的是,解释是错误的,答案也是错误的。非贪婪量词不能保证最短的匹配,因为它们只影响匹配结束的位置,而不是开始的位置。这个正则表达式从第一个斜杠匹配到结尾。 - Alan Moore
@Alan Moore,我不知道为什么选择了这个答案,可能因为它在那一刻适合我。谢谢你的解释。 - Ilia
好的,现在它是最佳答案了。 :D - Alan Moore
1
@jfriend00 围绕您的正则表达式提供了出色的答案和精彩的解释! - Paul
显示剩余2条评论

31

以防其他人遇到此线程并正在寻找简单的JS解决方案:

id.split('/').pop(-1)

(将字符串 id 按照 / 分割,并返回其中的最后一个元素)

12
简单、简短而美好。但是-1参数似乎是多余的,因为pop()总是返回最后一个元素。 - JHH
1
这太聪明了!而且很优雅。 - ecairol
正则表达式似乎更快 https://jsperf.com/last-element-of-array-xxx/2 - koral

28

这很容易理解:(?!.*/).+

让我解释一下:

首先,让我们匹配所有以斜杠结尾的内容,好吗?那是我们不想要的部分

.*/匹配最后一个斜杠之前的所有内容

然后,我们使用"Negative lookahead"(?!)来表示"我不想要这个,丢弃它"

(?!.*)就是"Negative lookahead"

现在,我们可以愉快地使用这个.+来取出我们不想要的内容旁边的任何内容

您可能需要转义/,所以它变成了:

(?!.*\/).+


13

这个正则表达式:[^\/]+$ - 像冠军一样工作:

var id = ".../base/nabb80191e23b7d9"

result = id.match(/[^\/]+$/)[0];

// results -> "nabb80191e23b7d9"

9

这应该可以工作:

last = id.match(/\/([^/]*)$/)[1];
//=> nabb80191e23b7d9

1
好的回答。在Perl中,正则表达式定界符必须进行转义,即使在字符类中也是如此,否则它就无法找到要解析的正则表达式。 - user557597

7

不懂JS,使用他人的例子(和一个猜测) -

id = id.match(/[^\/]*$/); // [0] 是可选项吗?


仅供参考,match函数返回一个数组。使用[0]将只返回第一个。这不是可选的。 - brduca
这个正则表达式中没有捕获组,如果没有引用索引,匹配是否被重载以返回整个匹配? - user557597

4
为什么不使用replace函数?
"http://google.com/aaa".replace(/(.*\/)*/,"")

产生 "aaa"。

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