2009-09-01 16 views
13

E 'la mia comprensione che tutti e tre di queste linee di seguito dovrebbe restituire un array con 2 risultati in esso. Tuttavia, RegExp restituirà solo 1 risultato, non importa quante volte la regex si ripete nella stringa.Javascript Regexp non restituire i risultati globali

Qualcuno può spiegare perché? E magari suggerire come posso ottenere RegExp per darmi risultati globali?

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

ora ciò che veramente mi intriga è che se provate '('New York New York') .match (/ new York/gi) 'che porterà solo 1 risultato (come un po previsto) e non riesco a pensare ad un modo migliore per andare in giro questo (quando altrimenti necessario) [diverso iterando su di esso] (http: // StackOverflow. com/domande/42328875/javascript-regex-to-remove-all-numeri-con-specifici-lenght-o-do-a-persistente)! :( – cregox

risposta

20

il terzo esempio è il modo migliore per ottenere l'array di corrispondenze.

RegExp.exec effettivamente ricorda la sua posizione, e restituisce il risultato successivo per le chiamate successive:

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

si potrebbe sfruttare questo per costruire un aray da soli, ma è più facile chiamare solo String.match –

+0

Ho una serie di parole chiave che sto cercando di ottenere un conteggio del numero di occorrenze di una stringa. Qual è la migliore modo di farlo? – StefanHayden

11

Questo è previsto, exec() restituisce una singola partita, ma fornisce maggiori informazioni circa la partita di match(). Se vuoi solo tutte le partite, usa match(). Da JavaScript: The Definitive Guide:

Ricordiamo che match() restituisce un array di partite quando viene passato un Expresion regolare globale. exec(), per contrario, restituisce sempre una singola partita e fornisce una completa informazioni su quella partita. Quando exec() viene chiamato su un normale epression che ha il flag g, imposta la proprietà lastIndex del abbinato sottostringa. Quando exec() viene invocato una seconda volta per la stessa espressione regolare , inizia la ricerca su nella posizione del carattere indicata da la proprietà lastIndex.

Problemi correlati