문자열에서 문자의 발생 횟수를 계산해야합니다.
예를 들어 내 문자열에 다음이 포함되어 있다고 가정합니다.
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
미리 찾고있는 것을 알고있는 경우 정규식 리터럴을 사용하고 RegExp
생성자를 사용할 수없는 경우 g
플래그를 인수로 전달하십시오.
match
null
결과없이 반환|| []
내가 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 가지 캐릭터 카운팅 방법 으로이 요점을 만들었 으므로 재미를 위해 아이디어를 모아 공유 할 수 있습니다.
답변
이 기능을 쏘는 프로토 타입에 추가하십시오 :
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 제품군을 볼 수 있습니다 .