计算 Javascript 字符串中某个字符出现的次数

IT技术 javascript string
2021-01-12 12:54:56

我需要计算一个字符在字符串中出现的次数。

例如,假设我的字符串包含:

var mainStr = "str1,str2,str3,str4";

我想找到逗号,字符的计数,即 3。以及沿逗号拆分后的单个字符串的计数,即 4。

我还需要验证每个字符串,即 str1 或 str2 或 str3 或 str4 不应超过 15 个字符。

6个回答

我已经更新了这个答案。我喜欢更好地使用匹配的想法,但它更慢:

console.log(("str1,str2,str3,str4".match(/,/g) || []).length); //logs 3

console.log(("str1,str2,str3,str4".match(new RegExp("str", "g")) || []).length); //logs 4

如果您事先知道要搜索的内容,请使用正则表达式文字,否则可以使用RegExp构造函数,并将g标志作为参数传递

match返回null没有结果,因此|| []

我在 2009 年的原始答案如下。它不必要地创建了一个数组,但使用拆分更快(截至 2014 年 9 月)。我很矛盾,如果我真的需要速度,毫无疑问我会使用拆分,但我更喜欢使用匹配。

旧答案(来自 2009 年):

如果您正在寻找逗号:

(mainStr.split(",").length - 1) //3

如果您正在寻找 str

(mainStr.split("str").length - 1) //4

在@Lo 的回答和我自己的愚蠢性能测试中,至少在 Chrome 中,速度都领先,但再次创建额外的数组似乎并不明智。

在这种情况下我更喜欢它是有原因的。将字符串拆分为数组以获取出现次数是一种获取该信息的方法。拆分数组的速度会更快,因为实现细节是可以更改的,而获取匹配数是可读性的改进,其意图很明显并且不会创建和填充未使用的数据结构。
2021-03-15 12:54:56
测试表明 Firefox 在拆分时比任何其他浏览器都要快得多。jsperf.com/count-the-number-of-occurances-in-string
2021-03-16 12:54:56
呃,我刚刚测试了 vsync 的 jsperf,正则表达式在 Chrome、Firefox 和 IE 中速度较慢分别为 68%、100% 和 14%。我有一个 i7 2600。
2021-03-17 12:54:56
我真的不喜欢使用正则表达式的想法,因为“你更喜欢它”。正则表达式有其目的,但通常当有一个简单的非正则表达式解决方案时,它是一个更好的选择。另请注意,这两种方法都创建了一个数组,因此这也不是使用正则表达式的理由。
2021-03-26 12:54:56
split() 是 javascript 中的一个基本工具,概念上很简单,并且对拆分进行计数给出了明确的意图并且是完全可读的。
2021-04-02 12:54:56

至少有五种方式。最好的选项,也应该是最快的(由于本地 RegEx 引擎)被放置在顶部。

方法一

("this is foo bar".match(/o/g)||[]).length;
// returns 2

方法二

"this is foo bar".split("o").length - 1;
// returns 2

不推荐拆分,因为它资源匮乏。它为每个匹配分配新的 'Array' 实例。不要通过 FileReader 尝试使用 >100MB 的文件。您可以使用Chrome 的分析器选项观察确切的资源使用情况

方法三

    var stringsearch = "o"
       ,str = "this is foo bar";
    for(var count=-1,index=-2; index != -1; count++,index=str.indexOf(stringsearch,index+1) );
// returns 2

方法四

搜索单个字符

    var stringsearch = "o"
       ,str = "this is foo bar";
    for(var i=count=0; i<str.length; count+=+(stringsearch===str[i++]));
     // returns 2

方法五

元素映射和过滤。不推荐这样做,因为它的整体资源预分配而不是使用 Pythonian 'generators':

    var str = "this is foo bar"
    str.split('').map( function(e,i){ if(e === 'o') return i;} )
                 .filter(Boolean)
    //>[9, 10]
    [9, 10].length
    // returns 2

分享: 我制作了这个要点,目前有 8 种字符计数方法,所以我们可以直接汇集和分享我们的想法 - 只是为了好玩,也许还有一些有趣的基准:)

Nathan,为了我的辩护,我在编写上面的代码之前确实详细说明了这一点:gist.github.com/2757164我想避免小代码片段的博客文章,但是这会让您通过 google-search 即时访问。Gist 作为代码段存储库的索引非常稀疏且不太理想。PS:我也讨厌不清楚的句法特性。
2021-03-10 12:54:56
Lo Sauer,无需为自己辩护,代码是可靠的,我通过弄清楚它是如何工作的方式自己学到了一些东西:) 我更喜欢这种方法而不是实际标记为答案的方法。如果我们不打算使用结果,就不需要拆分字符串。
2021-03-26 12:54:56
设置开始就足够了index = -2,但非常感谢@Augustus
2021-03-29 12:54:56
您的第三种方法(不幸的是,也是最快的)将错过大海捞针中索引 0 处的任何匹配项。您可以使用 do...while 循环来修复它: var strsearch = "o", str = "othis is foo bar", index = -1, count = -1; 做 { index = str.indexOf(strsearch, index+1); 计数++;} while (索引!= -1); 数数
2021-03-31 12:54:56
我花了一点时间才意识到发生了什么||[],但这个答案很棒!对于任何人都摸不着头脑,match()返回null如果没有找到匹配,并||[]会返回一个0长度的数组,如果match()回报率null,意义length()将返回0,而不是产生一个错误的类型。
2021-04-04 12:54:56

将此函数添加到 sting 原型:

String.prototype.count=function(c) { 
  var result = 0, i = 0;
  for(i;i<this.length;i++)if(this[i]==c)result++;
  return result;
};

用法:

console.log("strings".count("s")); //2
怎么样"stringsstringstrings".count("str")
2021-03-31 12:54:56

简单地说,使用拆分来找出字符串中某个字符出现的次数。

mainStr.split(',').length // 给出 4,这是使用分隔符逗号分割后的字符串数

mainStr.split(',').length - 1 // 给出 3,这是逗号的计数

一个快速的谷歌搜索得到了这个(来自http://www.codecodex.com/wiki/index.php?title=Count_the_number_of_occurrences_of_a_specific_character_in_a_string#JavaScript

String.prototype.count=function(s1) { 
    return (this.length - this.replace(new RegExp(s1,"g"), '').length) / s1.length;
}

像这样使用它:

test = 'one,two,three,four'
commas = test.count(',') // returns 3
*字符错误( SyntaxError: nothing to repeat)
2021-03-25 12:54:56
参数必须是正则表达式。所以如果你想计算's,你需要发送'[* ]'
2021-04-03 12:54:56