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

Насколько я понимаю, все три приведенные ниже строки должны возвращать МАССИВ с двумя результатами. Тем не менее 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"]

person StefanHayden    schedule 01.09.2009    source источник
comment
теперь меня действительно интригует то, что если вы попробуете (' New York New York ').match(/ New York /gi), это принесет только 1 результат (как и ожидалось), и я не могу придумать лучшего способа обойти это (когда это необходимо) кроме перебора! :(   -  person cregox    schedule 19.02.2017


Ответы (2)


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

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
person Rob Fonseca-Ensor    schedule 01.09.2009
comment
вы можете использовать это, чтобы построить массив самостоятельно, но проще просто вызвать string.match - person Rob Fonseca-Ensor; 01.09.2009
comment
У меня есть массив ключевых слов, которые я пытаюсь подсчитать количество вхождений в строке. как лучше всего это сделать? - person StefanHayden; 01.09.2009

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

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

person Derek Swingley    schedule 01.09.2009