Количество совпадений регулярного выражения в 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;