2009-07-02 22 views
63

Volevo scrivere un'espressione regolare per contare il numero di spazi/tabulazioni/nuova riga in un blocco di testo. Così ho ingenuamente scritto quanto segue: -Contare il numero di corrispondenze di una regex in Javascript

numSpaces : function(text) { 
    return text.match(/\s/).length; 
} 

Per alcune ragioni sconosciute si ritorna sempre 1. Qual è il problema con la dichiarazione di cui sopra? Da allora ho risolto il problema con il seguente: -

numSpaces : function(text) { 
    return (text.split(/\s/).length -1); 
} 

risposta

121

Il problema con il codice iniziale è che ti manca la global identifier:

>>> 'hi there how are you'.match(/\s/g).length; 
4 

Senza la g parte della regex sarà solo incontro la prima volta e fermati qui.

Si noti inoltre che la vostra espressione regolare conterà spazi successivi due volte:

>>> 'hi there'.match(/\s/g).length; 
2 

Se questo non è auspicabile, si potrebbe fare questo:

>>> 'hi there'.match(/\s+/g).length; 
1 
+5

Questo funziona fino a quando si dispone di almeno uno spazio nel vostro ingresso. In caso contrario, match() restituisce fastidiosamente null. – sfink

+3

sfink ha ragione, devi assolutamente verificare se match() ha restituito null: 'var result = text.match (/ \ s/g); ritorno risultato? result.length: 0; ' –

+36

Puoi anche proteggere dal null usando questa costruzione:' (str.match (...) || []) .length' –

7

Come accennato in my earlier answer, è possibile utilizzare RegExp.exec() per itera su tutte le partite e conta ogni occorrenza; il vantaggio è limitato alla sola memoria, perché nel complesso è circa il 20% più lento rispetto all'utilizzo di String.match().

var re = /\s/g, 
count = 0; 

while (re.exec(text) !== null) { 
    ++count; 
} 

return count; 
0

('my string' || []).match(/\s/g).length;

Problemi correlati