2009-03-03 6 views
8

날짜 문자열 형식을 감지하기 위해 Javascript RegExp 테스트를 작성했습니다. 실수로 중복 된 "g"플래그를 추가하고 흥미로운 것을 발견했습니다.Javascript RegExp의 재미있는 테스트

var s = "2009/03/10"; 
var regex=/^\d{4}[/]\d{2}[/]\d{2}$/g; 
alert(regex.test(s)); 
alert(regex.test(s)); 
alert(regex.test(s)); 
alert(regex.test(s)); 

나는 '진실'뒤에 '거짓', 다음에 '진실한', 또 다른 '거짓'이 있습니다.

루프를 사용하여 실행하면 더 흥미로운 것을 발견했으며 Internet Explorer 및 Safari에서 4 가지 "true"를 얻었고 FF, Chrome에서는 true, false, true, false를 얻었습니다.

for (var i=0; i<4; i++) 
{ 
    var s = "2009/03/10"; 
    var regex=/^\d{4}[/]\d{2}[/]\d{2}$/g; 
    alert(regex.test(s)); 
} 

아무도 자바 스크립트 정규식처럼 행동하고 어떤 원인 브라우저가 다른 결과를 반환 할 이유를 설명 할 생각을 갖고 있습니까? (변수 선언 및 수명 범위와 관련이 있습니까?)

답변

19

JS RegExp에서 전역 플래그를 사용하면 "test"및 "exec"메소드는 첫 번째 일치에서 각각 중단되지만 끈. 해당 포인터는 lastIndex 속성에서 검사 할 수 있습니다. "test"또는 "exec"를 다시 호출하면 lastIndex에서 시작하는 일치 항목을 검색하기 시작합니다.

따라서 전체 문자열과 일치하는 문자열에 대해 RegExp를 테스트하면 lastIndex가 문자열의 끝으로 설정됩니다. 다음에 테스트 할 때 문자열 끝에서 시작하여 false을 반환하고 lastIndex을 0으로 되돌립니다.

MDC에는이 동작의 decent explanation이 있습니다.

+0

감사를 많이 참조 MDC의 explaination은 매우 분명하다. – Darkthread

+0

+1 각 문제가 해결되기 전에 reg.lastIndex = 0으로 설정해 주셔서 감사합니다. – bendewey

+0

루프 내에서 문제가 발생하는 경우 각 테스트 전에 lastIndex = 0으로 설정할 수 있습니다. – k0nG

0

이상한 동작을 방지하려면 전역 (g) 플래그를 사용하지 마십시오.

이 코드를 출력하여야한다 :, '참'참 ','참 ','참 '

var s = "2009/03/10"; 
var regex=/^\d{4}[/]\d{2}[/]\d{2}$/i; 
alert(regex.test(s)); 
alert(regex.test(s)); 
alert(regex.test(s)); 
alert(regex.test(s)); 

글로벌 (g) 평면 속성을 설정 RegExp.lastIndex. 따라서 각 테스트()는 마지막 테스트가 중지 된 곳에서 시작됩니다. 더 많은 정보를 들어

이 문서에 대한 RegExp.lastIndex

관련 문제