2009-09-01 10 views
13

To moja zrozumienie, że wszystkie te trzy linie poniżej powinien zwracać tablicę z 2 wyników w nim. Jednak RegExp zwróci tylko 1 wynik, niezależnie od tego, ile razy regex powtarza się w ciągu znaków.JavaScript RegExp nie wraca globalne wyniki

Może ktoś wyjaśnić, dlaczego? A może zasugerować, w jaki sposób mogę uzyskać RegExp, aby dać mi globalne wyniki?

//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

teraz co mnie naprawdę intryguje to, że jeśli spróbujesz '('New York New York') .match (/ New York/gi) 'przyniesie tylko 1 wynik (jak można się spodziewać) i nie mogę wymyślić lepszego sposobu obejścia tego (w razie potrzeby) [poza iteracją nad nim] (http: // stackoverflow. com/questions/42328875/javascript-regex-to-remove-all-numbers-with-specific-lenght-or-do-a-persistent)! :( – cregox

Odpowiedz

20

Twój trzeci przykład to najlepszy sposób na uzyskanie tablicy dopasowań.

RegExp.exec rzeczywiście pamięta swoją pozycję, i zwraca następny wynik na kolejnych połączeń:

>>> 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

można wykorzystać to do budowania aray siebie, ale łatwiej jest po prostu zadzwoń String.match –

+0

Mam tablicę słów kluczowych, które staram się dostać zliczenie liczby wystąpień w ciąg. Jaki jest najlepszy sposób to zrobić? – StefanHayden

11

To normalne, exec() zwraca pojedynczy mecz, ale dostarcza więcej informacji o meczu niż match(). Jeśli chcesz tylko wszystkie mecze, użyj match(). Od JavaScript: The Definitive Guide:

Przypomnijmy, że match() zwraca tablicę zapałek kiedy przeszedł globalny wyrażenie regularne. exec(), przez Natomiast zawsze zwraca pojedynczy dopasowanie i zapewnia kompletną informacji o tym meczu. Kiedy exec() jest wywoływana w regularnych epression który ma flaga g, ustawia własnością lastIndex dopasowanej podciągu. Kiedy exec() jest wywoływana z raz drugi w tym samym regularną wypowiedzi, zaczyna swoje poszukiwania na pozycję znaku wskazanego przez własnością lastIndex.

Powiązane problemy