Javascript Regexp没有返回全局结果

时间:2009-09-01 14:55:40

标签: javascript regex global

我的理解是,下面这三行中的所有三行都应返回一个包含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"]

2 个答案:

答案 0 :(得分:21)

你的第三个例子是获得比赛数组的最佳方式。

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

答案 1 :(得分:12)

这是预期的,exec()返回单个匹配但提供有关匹配的更多信息而不是match()。如果您只想要所有匹配项,请使用match()。来自JavaScript: The Definitive Guide

  

回想一下match()返回一个数组   传递全局时的匹配   定期表达。 exec(),by   相反,总是返回一个   匹配并提供完整的   有关该比赛的信息。什么时候   exec()是在常规上调用的   具有g标志的epression,它设置   匹配的lastIndex属性   子。当exec()被调用时   第二次为同一个常规   表达式,它开始搜索   由...表示的角色位置   lastIndex属性。