Javascript Regexp не возвращает глобальные результаты

Я понимаю, что все три из этих строк ниже должны возвращать 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"]

Ответы

Ответ 1

ваш третий пример - лучший способ получить массив совпадений.

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

Ожидается, что exec() возвращает одно совпадение, но предоставляет больше информации о совпадении, чем match(). Если вам просто нужны все совпадения, используйте match(). Из JavaScript: окончательное руководство:

Вспомним, что match() возвращает массив матчей, когда прошло глобальное регулярное выражение. exec(), по контраст, всегда возвращает один сопоставить и обеспечить полный информацию об этом матче. когда exec() вызывается на регулярной который имеет флаг g, он устанавливает свойство lastIndex совпадающего подстрока. Когда exec() вызывается второй раз для того же регулярного выражения, он начинает поиск в положение символа, указанное свойство lastIndex.