这肯定是有很多陷阱的东西。我正在使用 Paolo Bergantino 的答案,并意识到即使这样也有一些局限性。我发现使用日期的字符串表示是快速找到一些主要问题的好地方。从这样的输入字符串开始:
'12-2-2019 5:1:48.670'
并像这样设置 Paolo 的函数:
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;
}