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