在Javascript中是否有一个函数返回给定字符串出现的次数? 我需要返回一个数值,该值等于给定字符串在特定字符串中出现的次数,例如:
var myString = "This is a test text"
如果我必须在上面的字符串中搜索“te
”,它将返回2.
答案 0 :(得分:13)
非常接近:您可以使用String#match
执行此操作:
var count = "This is a test text".match(/te/g).length;
使用正则表达式/te/g
(从字面上全局搜索“te”)并要求字符串返回匹配数组。然后数组的长度就是计数。
当然,这会创建一个中间数组,如果你有一个大的结果集,这可能并不理想。如果你不介意循环:
function countMatches(str, re) {
var counter;
counter = 0;
while (re.test(str)) {
++counter;
}
return counter;
}
var count = countMatches("This is a test text", /te/g);
使用RegExp#test
查找匹配而不创建中间数组。 (感谢kennebec的评论,指出我之前在上面创建的中间数组中使用RegExp#exec
不必要!)它是否更有效将完全取决于您希望匹配的数量,因为创建的版本一个大数组可能会在String#match
调用内进行优化,因此以更多(临时)内存使用为代价更快 - 一个大的结果集可能会因为尝试分配内存而陷入困境,但是一个小数组不太可能。
编辑重新评论下面的评论,如果您不是在寻找模式并且您不介意循环,那么您可能需要这样做:
function countMatches(str, substr) {
var index, counter, sublength;
sublength = substr.length;
counter = 0;
for (index = str.indexOf(substr);
index >= 0;
index = str.indexOf(substr, index + sublength))
{
++counter;
}
return counter;
}
var count = countMatches("This is a test text", "te");
我知道没有预先制作的非RegExp方法来做到这一点。
答案 1 :(得分:2)
这是js中php的substr_count()的实现。愿这个功能带给你很多快乐......
substr_count = function(needle, haystack)
{
var occurrences = 0;
for (var i=0; i < haystack.length; i++)
{
if (needle == haystack.substr(i, needle.length))
{
occurrences++;
}
}
return occurrences;
}
alert(substr_count('hey', 'hey hey ehy w00lzworth'));
答案 2 :(得分:2)
我喜欢使用test来计算匹配 - 使用全局正则表达式,它通过每个lastIndex的字符串(如exec)工作,但不必构建任何数组:
var c=0;
while(rx.test(string)) c++
String.prototype.count= function(rx){
if(typeof rx== 'string') rx= RegExp(rx,'g');
var c= 0;
while(rx.test(this)) c++;
return c;
}