Количество совпадений регулярного выражения в Javascript

Я хотел написать регулярное выражение, чтобы подсчитать количество пробелов /tabs/newline в куске текста. Поэтому я наивно писал следующее: -

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

По неизвестным причинам он всегда возвращает 1. В чем проблема с вышеприведенным выражением? С тех пор я решил проблему со следующим: -

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

Ответ 1

Проблема с вашим исходным кодом заключается в том, что вам не хватает глобального идентификатора:

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

Без g части регулярного выражения он будет соответствовать только первому вхождению и остановится там.

Также обратите внимание, что ваше регулярное выражение будет считать пробелы дважды:

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

Если это нежелательно, вы можете сделать это:

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

Ответ 2

Как упоминалось в моем более раннем ответе, вы можете использовать RegExp.exec() перебирать все совпадения и подсчитывать каждое событие; преимущество ограничено только памятью, потому что в целом это примерно на 20% медленнее, чем использование String.match().

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

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

return count;