我正在尝试解析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
之前仅捕获名称?
答案 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()
选择不返回捕获的组匹配,只返回所有多个完整匹配。
如果正则表达式包含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()