Javascript에서 문자열의 문자 발생 횟수를 계산하십시오. = “str1,str2,str3,str4”; 쉼표 ,문자 수인 3

문자열에서 문자의 발생 횟수를 계산해야합니다.

예를 들어 내 문자열에 다음이 포함되어 있다고 가정합니다.

var mainStr = "str1,str2,str3,str4";

쉼표 ,문자 수인 3 을 찾고 싶습니다 . 쉼표를 따라 분할 한 후 개별 문자열의 수는 4입니다.

또한 각 문자열 즉, str1 또는 str2 또는 str3 또는 str4가 15자를 초과하지 않아야하는지 확인해야합니다.



답변

이 답변을 업데이트했습니다. 일치를 더 잘 사용한다는 아이디어가 마음에 들지만 속도가 느립니다.

console.log(("str1,str2,str3,str4".match(/,/g) || []).length); //logs 3

console.log(("str1,str2,str3,str4".match(new RegExp("str", "g")) || []).length); //logs 4

jsfiddle

미리 찾고있는 것을 알고있는 경우 정규식 리터럴을 사용하고 RegExp생성자를 사용할 수없는 경우 g플래그를 인수로 전달하십시오.

matchnull결과없이 반환|| []

내가 2009 년에 한 원래 답변은 다음과 같습니다. 불필요하게 배열을 생성하지만 분할을 사용하는 것이 더 빠릅니다 (2014 년 9 월 기준). 나는 속도를 정말로 필요로한다면 스플릿을 사용한다는 데는 의문의 여지가 없지만 일치하는 것을 선호합니다.

기존 답변 (2009 년부터) :

쉼표를 찾고 있다면 :

(mainStr.split(",").length - 1) //3

당신이 str을 찾고 있다면

(mainStr.split("str").length - 1) //4

@Lo 의 대답과 내 자신의 바보 jsperf 테스트 스플릿에서 적어도 Chrome에서는 속도가 앞서지만 추가 배열을 다시 만드는 것은 제정신이 아닌 것 같습니다.


답변

네 가지 방법이 있습니다. 기본 RegEx 엔진으로 인해 가장 빠른 옵션이 맨 위에 배치됩니다. jsperf.com이 현재 작동 중지되었습니다. 그렇지 않으면 성능 통계를 제공합니다.

업데이트 : 여기 에서 성능 테스트를 찾아서실행하여 성능 결과에 기여하십시오. 결과의 세부 사항은 나중에 제공됩니다.

1.

 ("this is foo bar".match(/o/g)||[]).length
 //>2

2.

"this is foo bar".split("o").length-1
 //>2

분할하지 않는 것이 좋습니다. 배고프다. 각 일치에 대해 ‘Array’의 새 인스턴스를 할당합니다. FileReader를 통해> 100MB 파일에 대해서는 시도하지 마십시오. 실제로 Chrome의 프로파일 러 옵션을 사용하여 정확한 리소스 사용량을 쉽게 관찰 할 수 있습니다 .

삼.

var stringsearch = "o"
   ,str = "this is foo bar";
for(var count=-1,index=-2; index != -1; count++,index=str.indexOf(stringsearch,index+1) );
 //>count:2

4.

단일 문자 검색

var stringsearch = "o"
   ,str = "this is foo bar";
for(var i=count=0; i<str.length; count+=+(stringsearch===str[i++]));
 //>count:2

최신 정보:

5.

요소 매핑 및 필터링 (Pythonian ‘generators’대신 전체 리소스 사전 할당으로 인해 권장되지 않음)

var str = "this is foo bar"
str.split('').map( function(e,i){ if(e === 'o') return i;} )
             .filter(Boolean)
//>[9, 10]
[9, 10].length
//>2

공유 :
나는 현재 8 가지 캐릭터 카운팅 방법 으로이 요점을 만들었 으므로 재미를 위해 아이디어를 모아 공유 할 수 있습니다.

https://gist.github.com/2757250


답변

이 기능을 쏘는 프로토 타입에 추가하십시오 :

String.prototype.count=function(c) {
  var result = 0, i = 0;
  for(i;i<this.length;i++)if(this[i]==c)result++;
  return result;
};

용법:

console.log("strings".count("s")); //2


답변

빠른 Google 검색에서 이것을 얻었습니다 ( http://www.codecodex.com/wiki/index.php?title=Count_the_number_of_occurrences_of_a_specific_character_in_a_string#JavaScript )

String.prototype.count=function(s1) {
    return (this.length - this.replace(new RegExp(s1,"g"), '').length) / s1.length;
}

다음과 같이 사용하십시오.

test = 'one,two,three,four'
commas = test.count(',') // returns 3


답변

간단히, split 을 사용하여 문자열에서 문자의 발생 횟수를 찾으십시오.

mainStr.split(',').length // 구분 기호 쉼표를 사용하여 분할 한 후 문자열 수인 4를 제공합니다. // 쉼표의 수인

mainStr.split(',').length - 1 3을 제공합니다.


답변

비슷한 솔루션이 있지만 다음을 사용합니다. Array.prototype.reduce

function countCharacters(char, string) {
  return string.split('').reduce((acc, ch) => ch === char ? acc + 1: acc, 0)
}

언급했듯이, String.prototype.split보다 훨씬 빠르게 작동합니다 String.prototype.replace.


답변

매우 큰 문자열에서 문자를 검색하는 가장 좋은 방법은 (예를 들어 길이가 1,000,000 자)이 replace()방법 을 사용하는 것입니다.

window.count_replace = function (str, schar) {
    return str.length - str.replace(RegExp(schar), '').length;
};

문자열에서 문자를 찾는 다른 방법과 함께이 방법을 테스트하는 또 다른 JSPerf 제품군을 볼 수 있습니다 .