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



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



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


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



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

4 ответов:

tl; dr: общий счетчик шаблонов

// THIS IS WHAT YOU NEED
const count = (str) => {
  const re = /YOUR_PATTERN_HERE/g
  return ((str || '').match(re) || []).length
}

для тех, кто прибыл сюда, ища общий способ подсчета количества вхождений шаблона регулярных выражений в строке и не хочет, чтобы он потерпел неудачу, если есть нулевые вхождения, этот код-то, что вам нужно. Вот пример:

/*
 *  Example
 */

const count = (str) => {
  const re = /[a-z]{3}/g
  return ((str || '').match(re) || []).length
}

const str1 = 'abc, def, ghi'
const str2 = 'ABC, DEF, GHI'

console.log(`'${str1}' has ${count(str1)} occurrences of pattern '/[a-z]{3}/g'`)
console.log(`'${str2}' has ${count(str2)} occurrences of pattern '/[a-z]{3}/g'`)

Оригинальный Ответ

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

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

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

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

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

return count;

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

Как насчет такой

function isint(str){
    if(str.match(/\d/g).length==str.length){
        return true;
    }
    else {
         return false
    }
}

Comments

    Ничего не найдено.