String#match()捕获组的奇怪行为

时间:2014-01-21 18:20:50

标签: javascript regex capturing-group

问题:我有一个字符串,例如:"to see to be to read"我想要捕获没有“to”前缀的3个动词,在此案例:beseeread

在Regex 101上,我尝试了this really simple regex并解决了问题:

正则表达式/to (\w+)/g
结果: ['be', 'see', 'read']

只是出于好奇,我使用正向前瞻制作了this another regex,结果是一样的。

正则表达式/(?=to \w+)\w+ (\w+)/g
结果: ['be', 'see', 'read']

好。奇怪的是:当我在浏览器控制台(Chrome或Firefox)上运行此正则表达式时,结果会有所不同。以下两次尝试给出了相同的结果:所有三组包括 to前缀。

> 'to be to see to read'.match(/to (\w+)/g)
  ["to be", "to see", "to read"]

> 'to be to see to read'.match(/(?=to \w+)\w+ (\w+)/g)
  ["to be", "to see", "to read"]    

我在这里遗漏了什么,还是我踩到了虫子?

免责声明:这不是家庭作业,我只是为了解决更大的问题。我不是一名正则表达专家,但对此有所了解。

编辑:我想我被Regex101愚弄了。它给我的代码示例显示了String#match()方法,但此函数不会在结果组上相应地排除正则表达式组。循环过RegExp#exec()次比赛是可行的方法!

1 个答案:

答案 0 :(得分:1)

在Javascript中捕获组的正确方法是在while循环中使用RegExp#exec方法:

var re = /to (\w+)/g,
    matches = [],
    input = "to see to be to read";
while (match = re.exec(input))
   matches.push(match[1]);

console.log(matches);
//=> ["see", "be", "read"]