在Javascript中是否有一个函数返回给定字符串出现的次数?

时间:2010-03-24 14:54:40

标签: javascript string

在Javascript中是否有一个函数返回给定字符串出现的次数? 我需要返回一个数值,该值等于给定字符串在特定字符串中出现的次数,例如:

var myString = "This is a test text"

如果我必须在上面的字符串中搜索“te”,它将返回2.

3 个答案:

答案 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;
}