정규식과 일치하는 문자열인지 확인하기위한 regex.test VS string.match


287

여러 번 문자열을 사용하고 있습니다 match 함수를 이 정규식과 일치하는지 알고 있습니다.

if(str.match(/{regex}/))

이것 사이에 차이점이 있습니까?

if (/{regex}/.test(str))

그들은 같은 결과를주는 것 같습니까?


4
이들은 당신이 찾을 수있는 최고의 테스트입니다 jsperf.com/regexp-test-vs-match-m5
ajax333221

@ ajax333221. jsperf에 감사드립니다.하지만 좋은지 잘 모르겠습니다. 부울 값을 찾을 때 필요하지 않은 일치 그룹을 사용하는 정규식 일치.
gdoron은 Monica

답변:


440

기본 사용법

먼저, 각 기능이 무엇을하는지 보자 :

의 RegexObject . 테스트 ( 문자열 )

정규식과 지정된 문자열이 일치하도록 검색을 실행합니다. true 또는 false를 반환 합니다 .

문자열 . 일치 ( RegExp )

문자열을 정규식과 일치시킬 때 일치 항목을 검색하는 데 사용됩니다. 일치하는 배열이 있거나 null없는 배열을 반환합니다 .

이후 null로 평가 false,

if ( string.match(regex) ) {
  // There was a match.
} else {
  // No match.
} 

공연

성능과 관련하여 차이가 있습니까?

. MDN 사이트 에서이 짧은 메모를 찾았습니다 .

문자열이 정규식 regexp와 일치하는지 알아야하는 경우 regexp.test (string)를 사용하십시오.

차이가 중요합니까?

한 번 더 대답은 예입니다 ! 이 jsPerf 는 브라우저에 따라 차이가 ~ 30 % ~ ~ 60 % 임을 보여줍니다 .

테스트 대 경기 |  성능 테스트

결론

.test더 빠른 부울 검사를 원하면 사용 하십시오. 사용 .match사용하는 경우 모든 일치를 검색하기 위해 g글로벌 플래그를.


5
문자열 함수가 물건을 뒤집어 놓고 일치하는 경우 배열을 만들어야하기 때문에 너무 놀라지 않습니다. 계속 사용하는 것 같습니다 .test(). :)

22
내 두 센트 : 성능이 과대 평가되었습니다. 두 옵션 중 하나는 모니터 깜박임에서 ~ 15,000 작업을 수행 할 수 있으므로 대량 정규식 클라이언트 측을 수행하지 않는 한 속도는 관련이 없습니다. 물론 boolean 결과가 당신이 따르는 것이라면 'test'는 논리적으로 올바른 함수입니다. Q / A BTW에 감사드립니다.
David Gilbertson

2
흥미롭게도 위의 jsPerf 테스트 (Chrome 41, OSX)를 사용하면 나보다 테스트가 41 % 더 느립니다.
Benjie

1
@AlexShilman indexOf는이 stackoverflow.com/questions/183496/… 에 따라 테스트하는 것보다 빠르지 만 빠릅니다 (더 빠를 것으로 예상됩니다).
podperson

1
여기에 당신을 물릴 수있는 한 가지 (최근에 우리 팀을 물었습니다) : Regex에서 'g'플래그를 사용하고 새로운 인스턴스를 생성하면 (즉, 새로운 RegExp (<regex_str>, 'g')) 예를 들어, "test"를 실행하는 것은 상태 저장입니다. 즉, 여러 번 실행될 때 다른 결과를 반환합니다. 자세한 내용은 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 를 참조하십시오.
davertron

118

정규 표현식에서 전역 플래그를 고려하는 것을 잊지 마십시오.

var reg = /abc/g;
!!'abcdefghi'.match(reg); // => true
!!'abcdefghi'.match(reg); // => true
reg.test('abcdefghi');    // => true
reg.test('abcdefghi');    // => false <=

이는 Regexp가 새 일치 항목이 발견 될 때 lastIndex를 추적하기 때문입니다.


21
내 regex.test ()가 무작위로 "true", "false", "true"로 기록되는 것을보고 머리를 두드리고있었습니다. 감사합니다!
adriendenat

7
이것이 더 나은 대답이라고 생각합니다. 그들은 동일한 결과를 제공하지 않으며 reg.test ()는 위험한 함정을 가지고 있다고 설명합니다. 나에게 이것은 string.match ()를 분명한 선택으로 만듭니다. 성능은 나에게 결코 문제가되지 않았습니다.
제임스

2
이건 중요하다! 다른 사람의 참조를 위해 ... 다른 모든 결과가없는 이유를 알아 내려고 미쳐가는 것을 발견이 : developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...

2
나처럼 혼란 스러우면 stackoverflow.com/q/1520800/3714913을 참조하십시오 . String.prototype.search () 도 있는데 , 인덱스를 반환하지만 내가 알 수있는 한이 문제는 없습니다.
Nateowami

3
궁금한 점은 무엇 .test()입니까? 지점없는 .test()문자열이 일치하는 정규 표현식을 가지고 있는지 확인하는가?
buhbang

0

이것은 내 벤치 마크 결과입니다 벤치 마크 결과

4,267,740 ops / sec ± 1.32 % 테스트 (60 회 샘플링)

exec 3,649,719 ops / sec ± 2.51 % (60 회 샘플링)

3,623,125 ops / sec와 일치 ± 1.85 % (62 회 샘플링)

6,230,325 ops / sec의 ± 0.95 % (62 회 샘플링)

테스트 방법은 match 방법보다 빠르지 만 가장 빠른 방법은 indexOf입니다.


indexOf는 정규 표현식과 관련이 없으므로 관련이 없습니다.
gdoron은
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.