正则表达式返回未捕获组而不是已捕获组

4

我遇到了一个奇怪的问题,似乎无法解决... 基本上,我的正则表达式返回了我没有捕获组的内容,而没有返回实际捕获的组。以下是正则表达式:

"localhost/a/b/c".match(/\/a\/b\/(.*?)/g);

据我所知,这应该返回["c"],但实际返回的是:
["/a/b/"]

我做错了什么?我以为捕获组应该被返回,而不是被忽略。

这里的问题在于/g修饰符和缺少$锚点。 - Ja͢ck
1个回答

6
尝试这样做: "localhost/a/b/c".match(//a/b/(.+)/)[1]
在你原来的正则表达式中,"localhost/a/b/c".match(/\/a\/b\/(.*?)/g);
  • . 表示任何字符
  • * 表示前一个字符类匹配0-无限次
  • ? 表示尽可能少地匹配之前指定的字符,同时仍然匹配剩余的正则表达式,但由于组后面没有任何内容,因此该组将不会捕获任何内容
  • 至少在这个例子中,你似乎不需要 g 修饰符。
  • 通过返回数组中的位置访问匹配的组,其中 [0] 是完整的匹配,[1] 是第一个捕获组,以此类推...

$('#myDiv').append( "localhost/a/b/c".match(/\/a\/b\/(.+)/)[1] );
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="myDiv"><div>


谢谢,为什么(.+)可以工作,而(.*?)不能?它们都是捕获组,对吗? - user3117575
因为 + 表示匹配一个或多个字符,而 * 表示匹配零个或多个字符。但更重要的是,如果在 * 后面紧跟着 ?,并且在该组后没有更多的匹配要求,则会导致捕获组根本不捕获任何字符。请参见我上面的编辑。 - Wesley Smith
1
你也可以使用(.*?)$,使用$来匹配字符串的末尾。虽然如此,他是正确的;.*将匹配任何字符“0次或多次”,而+将匹配它“1次或多次”。 - Makaze
@Makaze,谢谢。看来我还需要学习一些关于正则表达式的知识。 - user3117575
就我个人而言,RegexBuddy(http://www.regexbuddy.com/)对我帮助很大。能够在创建正则表达式时实时查看其运行情况非常棒。它大约20美元左右,但我认为非常值得。 - Wesley Smith

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