协慌网

登录 贡献 社区

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

如何计算特定字符串在另一个字符串中出现的次数。例如,这就是我要使用 Javascript 进行的操作:

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

答案

正则表达式中的g (是 global 的缩写)表示搜索整个字符串,而不是仅查找第一个匹配项。这场比赛is两次:

var temp = "This is a string.";
var count = (temp.match(/is/g) || []).length;
console.log(count);

并且,如果没有匹配项,则返回0

var temp = "Hello World!";
var count = (temp.match(/is/g) || []).length;
console.log(count);

/** Function that count occurrences of a substring in a string;
 * @param {String} string               The string
 * @param {String} subString            The sub string to search for
 * @param {Boolean} [allowOverlapping]  Optional. (Default:false)
 *
 * @author Vitim.us https://gist.github.com/victornpb/7736865
 * @see Unit Test https://jsfiddle.net/Victornpb/5axuh96u/
 * @see http://stackoverflow.com/questions/4009756/how-to-count-string-occurrence-in-string/7924240#7924240
 */
function occurrences(string, subString, allowOverlapping) {

    string += "";
    subString += "";
    if (subString.length <= 0) return (string.length + 1);

    var n = 0,
        pos = 0,
        step = allowOverlapping ? 1 : subString.length;

    while (true) {
        pos = string.indexOf(subString, pos);
        if (pos >= 0) {
            ++n;
            pos += step;
        } else break;
    }
    return n;
}

用法

occurrences("foofoofoo", "bar"); //0

occurrences("foofoofoo", "foo"); //3

occurrences("foofoofoo", "foofoo"); //1

allowOverlapping

occurrences("foofoofoo", "foofoo", true); //2

火柴:

foofoofoo
1 `----´
2    `----´

单元测试

基准

我进行了基准测试,其功能比 gumbo 发布的 regexp match 函数快 10 倍以上。在我的测试字符串中,长度为 25 个字符。出现了 2 个字符 “o”。我在 Safari 中执行了 1000000 次。

的 Safari 5.1

基准测试 > 总执行时间:5617 毫秒(正则表达式)

Benchmark > 总执行时间:881 毫秒(我的功能快 6.4 倍)

Firefox 4

基准测试 > 总执行时间:8547 毫秒(Rexexp)

基准测试 > 总执行时间:634 毫秒(我的功能快 13.5 倍)


编辑:我所做的更改

  • 缓存的子串长度

  • 在字符串中添加了类型转换。

  • 添加了可选的'allowOverlapping' 参数

  • 修复了 “” 空子字符串大小写正确的输出。

要旨
function countInstances(string, word) {
   return string.split(word).length - 1;
}