16

我的理解是,下面所有这三行都应该返回一个包含 2 个结果的 ARRAY。然而,无论正则表达式在字符串中重复多少次,RegExp 都只会返回 1 个结果。

有人可以解释为什么吗?也许建议我如何让 RegExp 给我全球结果?

//INTPUT: 
    console.log(new RegExp("New York", "gi").exec("New York New York")); 

//OUTPUT: 
["New York"]

//INTPUT: 
    console.log(new RegExp(/New York/gi).exec("New York New York"));

//OUTPUT: 
["New York"]

//INTPUT: 
    console.log("New York New York".match(/New York/gi));

//OUTPUT:
["New York", "New York"]
4

2 回答 2

25

您的第三个示例是获取匹配数组的最佳方法。

RegExp.exec 实际上会记住它的位置,并在后续调用中返回下一个结果:

>>> var v = /new york/gi
>>> v.exec("NEW YORK new york")
["NEW YORK"]
>>> v.exec("NEW YORK new york")
["new york"]
>>> v.exec("NEW YORK new york")
null
于 2009-09-01T15:05:54.780 回答
13

这是意料之中的,exec() 返回单个匹配,但提供的匹配信息比 match() 更多。如果您只想要所有匹配项,请使用 match()。来自JavaScript:权威指南

回想一下,当传递一个全局正则表达式时,match() 返回一个匹配数组。相比之下,exec() 总是返回一个匹配项并提供有关该匹配项的完整信息。当在具有 g 标志的常规 epression 上调用 exec() 时,它会设置匹配子字符串的 lastIndex 属性。当对同一个正则表达式第二次调用 exec() 时,它会从 lastIndex 属性指示的字符位置开始搜索。

于 2009-09-01T15:04:16.733 回答