3 回答
TA贡献1794条经验 获得超8个赞
通用模式计数器
// 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
TA贡献1841条经验 获得超3个赞
如我先前的回答中所述,您可以RegExp.exec()用来遍历所有匹配并计算每次匹配;优点仅限于内存,因为总体而言,它比使用慢约20%String.match()。
var re = /\s/g,
count = 0;
while (re.exec(text) !== null) {
++count;
}
return count;
添加回答
举报