[javascript] 문자열에서 문자열 발생을 계산하는 방법은 무엇입니까?

다른 문자열에서 특정 문자열이 발생하는 횟수를 계산하는 방법은 무엇입니까? 예를 들어, 이것은 자바 스크립트에서하려고하는 것입니다.

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



답변

g(짧은 정규 표현식에서 글로벌은 ) 단지 첫 번째 항목을 찾을 것이 아니라 전체 문자열을 검색 말한다. 이것은 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가 게시 한 정규 표현식 일치 기능보다 10 배 이상 빠릅니다. 내 테스트 문자열의 길이는 25 자입니다. ‘o’라는 문자가 2 번 나타납니다. Safari에서 100,000 회 실행했습니다.

사파리 5.1

벤치 마크> 총 실행 시간 : 5617ms (정규 표현식)

벤치 마크> 총 실행 시간 : 881ms (내 기능 6.4 배 빠름)

Firefox 4

벤치 마크> 총 실행 시간 : 8547ms (Rexexp)

벤치 마크> 총 실행 시간 : 634ms (내 기능 13.5 배 빠름)


편집 : 내가 변경 한 사항

  • 캐시 된 부분 문자열 길이

  • 문자열에 타입 캐스팅을 추가했습니다.

  • 선택적 ‘allowOverlapping’매개 변수 추가

  • “”빈 부분 문자열 경우에 대한 올바른 출력을 수정했습니다.

요점


답변

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


답변

당신은 이것을 시도 할 수 있습니다 :

var theString = "This is a string.";
console.log(theString.split("is").length - 1);


답변

내 해결책 :

var temp = "This is a string.";

function countOcurrences(str, value) {
  var regExp = new RegExp(value, "gi");
  return (str.match(regExp) || []).length;
}

console.log(countOcurrences(temp, 'is'));


답변

match이러한 기능을 정의 하는 데 사용할 수 있습니다 .

String.prototype.count = function(search) {
    var m = this.match(new RegExp(search.toString().replace(/(?=[.\\+*?[^\]$(){}\|])/g, "\\"), "g"));
    return m ? m.length:0;
}


답변

비정규 버전 :

 var string = 'This is a string',
    searchFor = 'is',
    count = 0,
    pos = string.indexOf(searchFor);

while (pos > -1) {
    ++count;
    pos = string.indexOf(searchFor, ++pos);
}

console.log(count);   // 2