2009-07-02 20 views
63

Chciałem napisać wyrażenie regularne, aby policzyć liczbę spacji/kart/znaków nowej linii w kawałku tekstu. Więc ja naiwnie napisał następujące: -Policz liczbę dopasowań wyrażenia regularnego w JavaScript

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

Dla niektórych nieznanych przyczyn zawsze zwraca 1. Jaki jest problem z powyższym stwierdzeniem? I od tego czasu rozwiązać problem z następujących czynności: -

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

Odpowiedz

121

Problem z kodem początkowym jest, że brakuje global identifier:

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

Bez g części regex to będzie tylko mecz pierwsze wystąpienie i zatrzymaj się tam.

Należy również pamiętać, że wyrażenie regularne będzie liczyć kolejnych spacji dwa razy:

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

Jeśli nie jest to pożądane, można to zrobić:

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

Działa to tak długo, jak masz co najmniej jedno miejsce w swoim wejściu. W przeciwnym razie funkcja match() denerwująco zwróci wartość null. – sfink

+3

sfink ma rację, na pewno chcesz sprawdzić, czy match() zwrócił wartość null: 'var result = text.match (/ \ s/g); wynik zwrotu? result.length: 0; ' –

+36

Można również zabezpieczyć się przed wartością zerową za pomocą tej konstrukcji:' (str.match (...) || []) .length' –

7

Jak wspomniano w my earlier answer, można użyć RegExp.exec() do powtórzenie wszystkich meczów i zliczenie każdego wystąpienia; przewaga jest ograniczona tylko do pamięci, ponieważ w sumie jest około 20% wolniejsza niż przy użyciu String.match().

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

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

return count; 
0

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

Powiązane problemy