В Javascript есть функция, которая возвращает количество раз, когда данная строка встречается? - PullRequest
3 голосов
/ 24 марта 2010

В Javascript есть функция, которая возвращает количество раз, когда данная строка встречается? Мне нужно вернуть числовое значение, которое равно числу раз, которое данная строка встречается в конкретной строке, например:

var myString = "This is a test text"

Если бы мне пришлось искать 'te' в приведенной выше строке, он вернул бы 2.

Ответы [ 3 ]

13 голосов
/ 24 марта 2010

Очень близко: вы можете использовать String#match, чтобы сделать это:

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);

Использует RegExp#test для поиска совпадений без создания промежуточных массивов. (Спасибо kennebec за комментарий, указывающий, что мое более раннее использование RegExp#exec в вышеупомянутых созданных промежуточных массивах излишне!) То, будет ли это более эффективным, будет полностью зависеть от того, сколько из них вы ожидаете найти, версия, создающая один большой массив, вероятно, будет оптимизирована в рамках вызова String#match и, следовательно, будет быстрее за счет большего (временного) использования памяти & mdash; большой набор результатов может затормозиться при попытке выделить память, но малый вряд ли удастся.

Редактировать Прокомментируйте ваш комментарий ниже, если вы не ищете паттернов и не возражаете против зацикливания, вы можете сделать это вместо этого:

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 способа сделать это.

2 голосов
/ 24 марта 2010

Мне нравится использовать 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;
}
2 голосов
/ 24 марта 2010

Вот реализация substr_count () в php в 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'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...