В этом, безусловно, есть множество ловушек. Я работал с ответом Паоло Бергантино и понимал, что даже у него есть некоторые ограничения. Я нашел, что работа со строковыми представлениями дат - хорошее место, чтобы быстро найти некоторые из основных проблем. Начните с такой строки ввода:
'12-2-2019 5:1:48.670'
и настройте функцию Паоло следующим образом:
function count(re, str) {
if (typeof re !== "string") {
return 0;
}
re = (re === '.') ? ('\\' + re) : re;
var cre = new RegExp(re, 'g');
return ((str || '').match(cre) || []).length;
}
Я хотел, чтобы регулярное выражение было передано, чтобы функция была более многоразовой, во-вторых, я хотел, чтобы параметр был строкой, чтобы клиенту не приходилось создавать регулярное выражение, а просто совпадать со строкой, например стандартный метод служебного класса строки.
Теперь вы можете видеть, что я имею дело с проблемами с вводом. Со следующим:
if (typeof re !== "string") {
return 0;
}
Я обеспечение , что входной нет ничего подобного в буквальном смысле 0, false, undefinedили null, ни один из которых являются строками. Поскольку этих литералов нет во входной строке, совпадений быть не должно, но они должны совпадать '0', то есть строка.
Со следующим:
re = (re === '.') ? ('\\' + re) : re;
Я имею дело с тем, что конструктор RegExp (я думаю, ошибочно) интерпретирует строку '.'как сопоставление всех символов\.\
Наконец, поскольку я использую конструктор RegExp, мне нужно присвоить ему глобальный 'g'флаг, чтобы он учитывал все совпадения, а не только первое, как и в других сообщениях.
Я понимаю, что это очень поздний ответ, но он может быть полезен тем, кто здесь спотыкается. Кстати, вот версия TypeScript:
function count(re: string, str: string): number {
if (typeof re !== 'string') {
return 0;
}
re = (re === '.') ? ('\\' + re) : re;
const cre = new RegExp(re, 'g');
return ((str || '').match(cre) || []).length;
}