Javascript Regexp не возвращает глобальные результаты - PullRequest
14 голосов
/ 01 сентября 2009

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

21 голосов
/ 01 сентября 2009

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

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
12 голосов
/ 01 сентября 2009

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

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

...