/** 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 `----´
Единичный тест
Я проверил тестовый тест и моя функция более чем в 10 раз быстрее, чем функция соответствия регулярному выражению, отправленная gumbo. В моей тестовой строке длина 25 символов. с 2 вхождениями символа 'o'. Я выполнил 1 000 000 раз в Safari.
Safari 5.1
Benchmark> Общее время исполнения: 5617 ms (regexp)
Benchmark> Общее время исполнения: 881 ms (моя функция в 6.4 раза быстрее)
Firefox 4
Benchmark> Общее время исполнения: 8547 мс (Rexexp)
Benchmark> Общее время исполнения: 634 мс (моя функция на 13,5 раз быстрее)
Изменить: изменения, которые я сделал
blockquote> Gist
- длина кешированной кешировки
- добавлена листинг типа в строку .
- добавлен дополнительный параметр «allowOverlapping»
- исправленный правильный вывод для «пустого случая подстроки».