Javascript 字符串#match()捕获组的奇怪行为
问题:我有一个字符串,例如:Javascript 字符串#match()捕获组的奇怪行为,javascript,regex,capturing-group,Javascript,Regex,Capturing Group,问题:我有一个字符串,例如:“to see to be read”,我想捕获3个没有“to”前缀的动词,在这种情况下:be,see和read 在Regex 101上,我尝试过,它解决了问题: Regex:/to(\w+)/g 结果:['be','see','read'] 出于好奇,我用积极的前瞻性做了一个实验,结果是一样的 Regex:/(?=to\w+)\w+(\w+)/g 结果:['be','see','read'] 好的。奇怪的是:当我在浏览器控制台(Chrome或Firefox)上运行这
“to see to be read”
,我想捕获3个没有“to”前缀的动词,在这种情况下:be
,see
和read
在Regex 101上,我尝试过,它解决了问题:
Regex:/to(\w+)/g
结果:
['be','see','read']
出于好奇,我用积极的前瞻性做了一个实验,结果是一样的
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"]
我是错过了什么还是踩到了虫子
免责声明:这不是家庭作业,我只是针对一个更大的问题验证这一点。我不是regex的专家,但对它知道一两件事
编辑:我想我被Regex101愚弄了。它给我的代码示例显示了
String#match()
方法,但该函数没有相应地排除结果组上的regexp组。在RegExp#exec()
匹配项上循环是最好的选择 在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"]
六羟甲基三聚氰胺六甲醚。。。我懂了。因此,我认为剩下的问题是:
String#match()
为什么不按预期工作?它按预期工作,只是返回满足匹配的子字符串。正如anubhava所说,.exec()
方法是检索捕获组的方法。@EvertonAgner:String#match
不会返回所有捕获组,如PHP的preg(preg)match(all)。看看这个问答:哦,我明白了,我就靠这个了。谢谢