Javascript正则表达式未返回全局结果

16

据我的理解,下面这三行代码都应该返回一个包含两个结果的数组。但是无论正则表达式在字符串中重复多少次,RegExp只会返回一个结果。

有人能解释一下为什么吗?或者建议一下我如何让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"]

现在真正让我感到好奇的是,如果你尝试 (' New York New York ').match(/ New York /gi) 它只会带来一个结果(有点意料之中),而我想不出更好的方法来解决这个问题(当需要时除了迭代)除了迭代! :( - cregox
2个回答

26

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

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

2
你可以利用这个来构建一个数组,但直接调用 string.match 更容易。 - Rob Fonseca-Ensor
我有一个关键词数组,想要统计在一个字符串中出现的次数。有什么最好的方法可以做到这一点? - StefanHayden

13

这是预期的,exec()返回单个匹配项,但提供有关匹配项的更多信息,而不像match()可以获取所有的匹配项。如果您只想要所有匹配项,请使用match()。 来自JavaScript:权威指南

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接