JavaScript를 확인하는 가장 빠른 방법은 JavaScript에 다른 하위 문자열이 포함되어 있습니까?


163

JavaScript에서 성능 문제를 해결하고 있습니다. 그래서 그냥 묻고 싶습니다 : 문자열에 다른 하위 문자열이 포함되어 있는지 확인하는 가장 빠른 방법은 무엇입니까 (부울 값이 필요합니다)? 아이디어와 샘플 스 니펫 코드를 제안 해 주시겠습니까?


고정 부분 문자열에 대해 묻고 있습니까, 아니면 정규 표현식이 필요합니까 ( regex태그를 사용하면 약간 혼란 스럽습니다 )?
Tim Pietzcker

1
이 게시물이 도움이 될 것입니다 .. stackoverflow.com/questions/1789945/javascript-string-contains
mtk

문자열을 공백 주위의 배열로 분할하고 배열 교차를 수행하는 것은 어떻습니까? stackoverflow.com/questions/1885557/…
giorgio79

답변:


315

두 가지 가능성이 있습니다.

  1. 정규식 :

    (new RegExp('word')).test(str)
    // or
    /word/.test(str)
  2. indexOf:

    str.indexOf('word') !== -1

정규 표현식이 더 빠른 것 같습니다 (적어도 Chrome 10에서는).

성능 테스트-짧은 건초 더미
성능 테스트-긴 건초 더미


2011 년 업데이트 :

어떤 방법이 더 빠르다고 확신 할 수는 없습니다. 브라우저 간의 차이점은 엄청납니다. Chrome 10 indexOf에서는 빠르지 만 Safari 5에서는 indexOf다른 방법보다 속도가 느립니다.

당신은 자신을보고 시도해야합니다. 그것은 당신의 필요에 달려 있습니다. 예를 들어 대소 문자를 구분하지 않는 검색은 정규식을 사용하면 훨씬 빠릅니다.


2018 업데이트 :

사람들이 직접 테스트를 실행하지 못하도록하기 위해 가장 일반적인 브라우저의 현재 결과는 다음과 같습니다. 백분율은 다음으로 빠른 결과 (브라우저마다 다름)에 비해 성능이 향상되었음을 나타냅니다.

Chrome : indexOf (~ 98 % 빠름) <-- wow
Firefox : 캐시 된 RegExp (~ 18 % 빠름)
IE11 : 캐시 된 RegExp (~ 10 % 빠름)
Edge : indexOf (~ 18 % 빠름)
Safari : 캐시 된 RegExp (~ 0.4 % 빠름)

참고 정규식 캐시는 다음과 같습니다 var r = new RegExp('simple'); var c = r.test(str);반대로 :/simple/.test(str)


3
구문 분석 시간 동안 정규식이 JavaScript 엔진에 의해 작성되기 때문에 텍스트 검색 대상을 미리 알고있는 경우 (즉, 변수에 저장되지 않은 경우)에만 조금 더 빠를 수 있습니다. 다른 문자열 변수 내의 변수에 포함 된 문자열을 검색하려면 RegExp 객체를 만들고 특수 문자 등을 피하기 위해 문자열을 처리해야하기 때문에 indexOf가 가장 빠릅니다.
Stephen Chung

경험상, 검색 대상에
.toLowerCase

Microsoft의 Office Javascript API를 사용하여 Office 2013 앱을 작성하고 있는데 indexOf작동하지 않습니다. 왜 그런지 잘 모르겠습니다. 그래도 정규식을 사용합니다. 이것은 극단적 인 경우이지만 다른 사람들도 같은 문제가 발생할 수 있습니다.
Andy Mercer

substr ()이 가능한 해결책 중 하나가 아닌 이유는 무엇입니까? 많은 상황에서 RegEx 솔루션보다 훨씬 빠릅니다. 나는 같이 IndexOf () 비교 방법을 알고하지 않습니다하지만 (항상의 벌금, 어쩌면 그 효과에 메모를 추가하는 것이 다음 같이 IndexOf ()보다 더 수행하기 때문에 당신은 그것을 왼쪽으로 그렇게합니다.) 편집 : 이 JSperf 링크 쇼를 몇 가지 흥미로운 결과. 짧은 버전 : indexOf ()는 모든 메소드 중에서 가장 빠르지 만 문자열 길이와 반복되는 패턴에 따라 달라질 수 있습니다.
Byson

1
@ 들소 : 어디를 볼지 이미 알고 있다면 substr 만 사용할 수 있습니다. 나는 일반적인 솔루션에만 집중했습니다.
Felix Kling

17

이것이 당신을 위해 작동합니까?

string1.indexOf(string2) >= 0

편집 : string2에 반복 패턴이 포함되어 있으면 RegExp보다 빠르지 않을 수 있습니다. 일부 브라우저에서는 indexOf가 RegExp보다 훨씬 느릴 수 있습니다. 의견을 참조하십시오.

편집 2 : 문자열이 매우 길거나 반복되는 패턴이 포함 된 경우 RegExp가 indexOf보다 빠를 수 있습니다. 의견과 @Felix의 답변을 참조하십시오.


그러나 이것은 다른 방법과 어떻게 비교됩니까? 이것이 가장 빠른가요, 아니면 그렇게하는 많은 방법 중 하나입니까?
Chii

JavaScript 자체로 구현되므로 기본 코드를 실행하므로 빠르다. JavaScript 코드를 기반으로하는 다른 방법은 속도가 느려집니다. 정확한 문자열을 알고 있으면 정규식이 약간 빠를 수 있습니다 (JavaScript 엔진은 프로토 타입 체인을 따라 .indexOf를 찾을 필요가 없으므로).
Stephen Chung

대소 문자를 구분하지 않는 검색이 필요한 경우 RegExp 객체를 빌드하고을 호출해야 test합니다.
Stephen Chung

3
Safari에서 테스트를 실행했습니다. indexOf다른 방법보다 속도가 느립니다. 따라서 실제로 어떤 방법이 더 빠르다고 말할 수는 없습니다. 브라우저마다 다릅니다.
Felix Kling

@Felix, 그것은 좋은 관찰입니다 (실제로 직접 시도 할 때까지 아무것도 신뢰하지 마십시오)! 반복되는 패턴이 많은 문자열에서 말하는 것을 기억하는 것이 좋습니다. 정규식은 상태 머신으로 컴파일되고 단순 루프보다 훨씬 빨리 역 추적 할 수 있기 때문에 정규 루프는 단순한 루프 비교 구현보다 빠르게 수행해야합니다. 다음 문자로 추적하십시오. 실험을하고 이것을 꺼내면 +1!
Stephen Chung

17

가장 빠른

  1. (ES6) 포함
    var string = "hello",
    부분 문자열 = "lo";
    string.includes (하위 문자열);
  1. ES5 및 이전 indexOf
    var string = "hello",
    부분 문자열 = "lo";
    string.indexOf (하위 문자열)! == -1;

http://jsben.ch/9cwLJ

여기에 이미지 설명을 입력하십시오


8

ES6에서는이 includes()방법을 사용하여 한 문자열이 다른 문자열 내에서 반환되는지 true또는 false적절하게 반환되는지 확인할 수 있습니다 .

var str = 'To be, or not to be, that is the question.';

console.log(str.includes('To be'));       // true
console.log(str.includes('question'));    // true
console.log(str.includes('nonexistent')); // false

여기에 jsperf 가 있습니다

var ret = str.includes('one');

var ret = (str.indexOf('one') !== -1);

jsperf에 표시된 결과는 둘 다 잘 수행되는 것 같습니다.


include '인수로 "regex"를 사용할 수 있습니까? 처럼 : str.includes("x|y"); 동일한 호출에서 리터럴 "x"또는 "y"를 검색하십시오.
ptkato

@Patrick, 포함 문서에 따라 사용할 수 없습니다 regex. 귀하의 질문에 대한 주위에 한 작품str.includes("x") || str.includes('y')
zangw

크롬 자바 스크립트 (59)의 개선의 결과로서, indexOf매우 빠르고보다 includes(위쪽 1,600% 속도의). 초당 4,400 만 반복과 777+ 백만 i / sec 의 차이가 실제 성능에 어떤 영향을 미치는지 확실하지 않지만 모바일이 indexOf이상적인 선택이 될 만큼 충분한 이점을 제공 할 수 있습니다.
채드 레비

7

간단한 for 루프를 사용하여 문자열의 모든 요소를 ​​반복하고 using을 사용하여 비교하는 charAt것이 indexOf또는 보다 빠릅니다 Regex. 코드와 증명은 JSPerf 에서 구할 수 있습니다 .

ETA : indexOf그리고 charAt모두 jsperf.com에 나와있는 브라우저 범위의 데이터에 따라 크롬 모바일에 유사 끔찍한 수행


손으로 만든 기능이 내장 기능보다 낫다는 것이 이상하지만 바늘이 하나의 문자이기 때문입니다. 아직도 ...
Moss

Apple iPad (iOS 7.1.1)의 Chrome Mobile 36.0.1985.57에서 테스트되었습니다. IndexOf가 더 빠릅니다. 미안
rpax

@rpax CharAt은 IndexOf와 CharAt가 데스크톱에 비해 똑같이 성능이 떨어지는 Chrome Mobile을 제외하고 모든 플랫폼 (jsperf의 기록을 기반으로)에서 여전히 훨씬 빠릅니다 .
wpg4665

1
NodeJS에서 이것이 어떻게 수행되는지보고 싶습니다. 또한 하나의 문자 대 하위 문자열 만 찾고 있기 때문에 이것은 실제로 좋은 예가 아닙니다.
qodeninja

이것은 전혀 올바른 대답이 아닙니다. 하위 문자열을 검색하지 않고 하나의 단일 문자 만 발생합니다
Henrik Myntti

3

: 간단한 문자열을 찾는 같이 IndexOf () 메소드를 사용하여 정규 표현식을 사용하기 위해 거의 동일 http://jsperf.com/substring - 그래서 어느 하나 쓰기보다 쉽게 보인다 선택할.



1

.match()방법을 문자열 로 사용 하는 쉬운 방법 입니다.

var re = /(AND|OR|MAYBE)/;
var str = "IT'S MAYBE BETTER WAY TO USE .MATCH() METHOD TO STRING";
console.log('Do we found something?', Boolean(str.match(re)));

좋은 하루 되시길 바랍니다.


4
방법 match이있을 이유가 없습니다 test... 최고의 답변을 확인하십시오.
Bergi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.