Це, звичайно, щось, що має багато пасток. Я працював із відповіддю Паоло Бергантіно і розумів, що навіть це має певні обмеження. Я знайшов роботу з рядковими поданнями дат хорошим місцем для швидкого пошуку деяких основних проблем. Почніть із вхідного рядка наступним чином:
'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;
}