.match()包含所有内容,而不仅仅是caturing组(Javascript)

.match()包含所有内容,而不仅仅是caturing组(Javascript),javascript,regex,Javascript,Regex,我正在尝试解析robots.txt文件,并希望获得字符之间的所有内容:用户代理:和\n,我使用以下正则表达式: /User-agent: (.*)\n/g 这个正则表达式的唯一捕获组是(.*),它捕获除换行符以外的所有字符,但当我运行时: var exampleString = 'User-agent: example\n' var matches = exampleString.match(/User-agent: (.*)\n/g); 匹配[0]是用户代理:示例\n。比赛不应该只返回捕获

我正在尝试解析robots.txt文件,并希望获得字符之间的所有内容:
用户代理:
\n
,我使用以下正则表达式:

/User-agent: (.*)\n/g
这个正则表达式的唯一捕获组是(.*),它捕获除换行符以外的所有字符,但当我运行时:

var exampleString = 'User-agent: example\n'
var matches = exampleString.match(/User-agent: (.*)\n/g);
匹配[0]
用户代理:示例\n
。比赛不应该只返回捕获组而不是正则表达式中的所有内容吗?我还尝试使用非捕获组,如:
/(?:用户代理:)(.*)(?:\n)/g
,同样的情况也会发生

如何仅捕获
用户代理:
之后和
\n
之前的名称?

您应该使用其exec方法。这样:

var matches = new RegExp(/User-agent: (.*)\n/g).exec("User-agent: example\n")
匹配[0]
包含完整字符串,在本例中为“用户代理:示例\n”,
匹配[1]
包含第一个捕获组,因此为“示例”


如果一个捕获组中有多个,则匹配数组中有一个新值,从1开始。

使用
g
标志时,
.match()
的结果与不使用
g
标志时的结果不同。这是因为您有一个返回的数组,但是使用
g
标志将太多的内容放入其中。因此,
.match()
选择不返回捕获的组匹配,只返回所有多个完整匹配

发件人:

如果正则表达式包含g标志,则该方法返回 包含所有匹配子字符串而不是匹配对象的数组。 捕获的组不会返回

获取所有捕获的组的方法是使用带有
.exec()
的循环:

var-exampleString='User-agent:example\n';
var re=/User-agent:(.*)\n/g,match,matches=[];
while(match=re.exec(exampleString)){
matches.push(匹配[1]);
}

document.write(JSON.stringify(matches))您看到的是正常的match()行为。请。
/User-agent:(.*)\n/g.exec(exampleString)
返回一个数组
[“User-agent:example”,“example”]
这些答案解决了您的问题吗?如果是,,请勾选答案左侧的绿色复选标记,将最佳答案标记为已接受答案,以向社区表明您的问题已得到回答,然后您和提供答案的人都将获得一些声誉积分,从而在StackOverflow上获得更多特权。您将以何种方式获得这些积分RegExp.exec是否优于String.match?您需要添加额外的\以转义\n@Touffy正如您所读到的(链接的),如果设置了g标志,String.match不会返回捕获组。所以有两个选项,OP可以删除g标志(只有在他可以的情况下)并使用String.match,否则他只能使用RegExp对象谢谢。当你提出关于“应该”使用什么的主张时,写这样的解释是很有帮助的:)还有——为什么不使用regex Literal呢?(我的意思是,您确实使用了一个,但它被包装在一个RegExp构造函数中,这似乎是多余的)