如何统计字符串在另一个字符串中出现的次数?

839

我该如何在一个字符串中统计另一个特定字符串出现的次数?例如,我想在Javascript中实现以下操作:

var temp = "This is a string.";
alert(temp.count("is")); //should output '2'

23
这取决于你是否接受重叠实例,例如:var t = "sss";上述字符串中子串"ss"出现了几次?是1次还是2次?你是跳过每个实例,还是逐个字符地移动指针来寻找子串呢? - Tim
4
这个问题的改进基准:http://jsperf.com/string-ocurrence-split-vs-match/2 (基于Kazzkiq的基准测试)。 - idmean
在 JavaScript 中计算字符串中特定单词的总数 https://stackoverflow.com/a/65036248/4752258 - Farbod Aprin
这个视频似乎与此相关 - “Google编程面试与Facebook软件工程师” - https://www.youtube.com/watch?v=PIeiiceWe_w - Deryck
41个回答

2

ES2020提供了一个新的MatchAll方法,可能在这种特定情况下会有用。

在这里我们创建一个新的RegExp,请确保将'g'传递到函数中。

使用Array.from转换结果并计算长度,该长度返回2,与原始请求者的期望输出相同。

let strToCheck = RegExp('is', 'g')
let matchesReg = "This is a string.".matchAll(strToCheck)
console.log(Array.from(matchesReg).length) // 2


2
 function substrCount( str, x ) {
   let count = -1, pos = 0;
   do {
     pos = str.indexOf( x, pos ) + 1;
     count++;
   } while( pos > 0 );
   return count;
 }

2

添加了这个优化:

如何计算字符串中的出现次数?

这可能是这里最快的实现,但如果您用“pos+=searchFor.length”替换“++pos”,它会更快- hanshenrik

function occurrences(str_, subStr) {
  let occurence_count = 0
  let pos = -subStr.length
  while ((pos = str_.indexOf(subStr, pos + subStr.length)) > -1) {
    occurence_count++
  }
  return occurence_count
}

2
没有人会看到这个,但是偶尔回归递归和箭头函数还是很好的(双关语意味深长)。最初的回答。
String.prototype.occurrencesOf = function(s, i) {
 return (n => (n === -1) ? 0 : 1 + this.occurrencesOf(s, n + 1))(this.indexOf(s, (i || 0)));
};

1

这是我的解决方案,在2022年,使用map()和filter():

string = "Xanthous: A person with yellow hair. Her hair was very xanthous in colour."       
count = string.split('').map((e,i) => { if(e === 'e') return i;}).filter(Boolean).length

只是为了使用这些函数而玩乐。该示例计算我的字符串中“e”的数量。

这与使用match()函数相同:

(string.match(/e/g)||[]).length

或者简单地使用split()函数:

string.split('e').length - 1

我认为最好使用match(),因为它消耗的资源较少!我的回答只是为了好玩,并展示解决这个问题的许多可能性。


1
现在我遇到了一个非常古老的帖子,但是因为许多人都提供了他们的答案,所以我也想分享我的答案,希望能用这个简单的代码来帮助一些人。

var search_value = "This is a dummy sentence!";
var letter = 'a'; /*Can take any letter, have put in a var if anyone wants to use this variable dynamically*/
letter = letter && "string" === typeof letter ? letter : "";
var count;
for (var i = count = 0; i < search_value.length; count += (search_value[i++] == letter));
console.log(count);

我不确定这是否是最快的解决方案,但我喜欢它的简单性和不使用正则表达式(我只是不喜欢使用它们!)


1
你可以尝试这个。
let count = s.length - s.replace(/is/g, "").length;

1

这是我的解决方案。希望能对某些人有所帮助。

const countOccurence = (string, char) => {
const chars = string.match(new RegExp(char, 'g')).length
return chars;
}

0
var mystring = 'This is the lorel ipsum text';
var mycharArray = mystring.split('');
var opArr = [];
for(let i=0;i<mycharArray.length;i++){
if(mycharArray[i]=='i'){//match the character you want to match
    opArr.push(i);
  }}
console.log(opArr); // it will return matching index position
console.log(opArr.length); // it will return length

0

第二次迭代时减少迭代次数(仅在子字符串的第一个字母匹配时)但仍使用2个循环:

   function findSubstringOccurrences(str, word) {
        let occurrences = 0;
        for(let i=0; i<str.length; i++){
            if(word[0] === str[i]){ // to make it faster and iterate less
                for(let j=0; j<word.length; j++){
                    if(str[i+j] !== word[j]) break;
                    if(j === word.length - 1) occurrences++;
                }
            }
        }
        return occurrences;
    }
    
    console.log(findSubstringOccurrences("jdlfkfomgkdjfomglo", "omg"));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接