Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Javascript中是否有函数返回给定字符串出现的次数?_Javascript_String - Fatal编程技术网

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

在Javascript中是否有函数返回给定字符串出现的次数?,javascript,string,Javascript,String,在Javascript中是否有函数返回给定字符串出现的次数? 我需要返回一个数值,该数值等于给定字符串在特定字符串中出现的次数,例如: var myString = "This is a test text" 如果我必须在上面的字符串中搜索“te”,它将返回2。非常接近:您可以使用: var count = "This is a test text".match(/te/g).length; 它使用正则表达式/te/g(从字面上全局搜索“te”),并要求字符串返回匹配数组。然后数组的长度就是

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

var myString = "This is a test text"
如果我必须在上面的字符串中搜索“
te
”,它将返回2。

非常接近:您可以使用:

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);
用于在不创建中间数组的情况下查找匹配项的。(感谢kennebec的评论,指出我之前在上面创建的中间数组中使用的是不必要的!)它是否更高效将完全取决于您希望匹配的中间数组数量,由于创建一个大数组的版本可能会在
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方法可以做到这一点。

这里是php的substr\u count()在js中的一个实现。愿这个功能带给你更多的快乐

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'));
substr\u count=功能(针、草垛)
{
var值=0;
对于(var i=0;i
我喜欢使用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;
}

我可以传递变量而不是te吗?@William:当然,你可以从一个字符串中构建一个RegExp:
newregexp(theString,g)
(),但是你必须转义字符串中的任何特殊regex字符(我提供的文本也是如此,但是字符串中的正则表达式更复杂)。例如,要搜索
[
,您必须在文本RegExp(
/\[/g
)中指定
\[
;要通过字符串进行搜索,您必须进一步转义反斜杠,因为您在字符串文本中使用反斜杠,因此:
新的RegExp(\\[”,g)
。您会发现这可能会更加混乱。:-(re.exec(str)){这是一个很好的方法,但它并没有避免创建数组——它在每次执行循环时都会创建一个新的数组。您首先展示的匹配方法是计算模式匹配的更有效的方法。@kennebec:很好,我的解释不清楚。我的意思是它避免了创建一个大的临时数组。我回到过去并修复了它,而不是ks.:-@kennebec:现在我们用了
test
。Doh!