.match()包括一切,不仅包括caturing组(Javascript)

时间:2015-09-26 16:23:55

标签: javascript regex

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

/User-agent: (.*)\n/g

这个正则表达式的唯一捕获组是(。*),它捕获除换行符之外的每个字符,但是当我运行时:

var exampleString = 'User-agent: example\n'
var matches = exampleString.match(/User-agent: (.*)\n/g);

matches[0]User-agent: example\n。不应该匹配只返回捕获组而不是正则表达式中的所有内容吗?我也试过使用这样的非捕获组:/(?:User-agent: )(.*)(?:\n)/g并发生同样的事情。

如何在User-agent:之后和\n之前仅捕获名称?

2 个答案:

答案 0 :(得分:0)

你应该使用RegExp object,它的exec方法。就这样:

var matches = new RegExp(/User-agent: (.*)\n/g).exec("User-agent: example\n")

matches[0]包含完整字符串,在本例中为“User-agent:example \ n”, matches[1]包含第一个捕获组,因此“示例”。

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

答案 1 :(得分:0)

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

来自MDN's page on .match()

  

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

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



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




当然,由于您在显示的字符串中实际上没有多个匹配项,因此您可以通过从正则表达式中删除g标记来简化解决方案,然后您可以使用{获取捕获的组{1}}。



.match()