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
var result = text.match(/\s/g); return result ? result.length : 0;
( str.match(...) || [] ).length
Как упоминалось в моем предыдущем ответе , вы можете использовать
RegExp.exec()
для перебора всех совпадений и подсчета каждого вхождения; Преимущество ограничивается только памятью, потому что в целом она примерно на 20% медленнее, чем при использованииString.match()
.источник
На основе https://stackoverflow.com/a/48195124/16777, но исправлено, чтобы фактически работать в случае нулевых результатов.
источник
('my string'.match(/\s/g) || []).length;
источник
|| []
не туда поместили , так и должно быть('my string'.match(/\s/g) || []).length
В этом, безусловно, есть множество ловушек. Я работал с ответом Паоло Бергантино и понимал, что даже у него есть некоторые ограничения. Я нашел, что работа со строковыми представлениями дат - хорошее место, чтобы быстро найти некоторые из основных проблем. Начните с такой строки ввода:
'12-2-2019 5:1:48.670'
и настройте функцию Паоло следующим образом:
Я хотел, чтобы регулярное выражение было передано, чтобы функция была более многоразовой, во-вторых, я хотел, чтобы параметр был строкой, чтобы клиенту не приходилось создавать регулярное выражение, а просто совпадать со строкой, например стандартный метод служебного класса строки.
Теперь вы можете видеть, что я имею дело с проблемами с вводом. Со следующим:
Я обеспечение , что входной нет ничего подобного в буквальном смысле
0
,false
,undefined
илиnull
, ни один из которых являются строками. Поскольку этих литералов нет во входной строке, совпадений быть не должно, но они должны совпадать'0'
, то есть строка.Со следующим:
Я имею дело с тем, что конструктор RegExp (я думаю, ошибочно) интерпретирует строку
'.'
как сопоставление всех символов\.\
Наконец, поскольку я использую конструктор RegExp, мне нужно присвоить ему глобальный
'g'
флаг, чтобы он учитывал все совпадения, а не только первое, как и в других сообщениях.Я понимаю, что это очень поздний ответ, но он может быть полезен тем, кто здесь спотыкается. Кстати, вот версия TypeScript:
источник
как насчет этого
источник