2011-05-14 4 views
3

다음 자바 스크립트는 아무것도 (심지어 "false"를하지)를 출력하지 않으며, 실제로 실행 페이지에서 다른 자바 스크립트를 중지 :정규식/[_- %]/JavaScript가 깨지는 이유는 무엇입니까?

var pattern = new RegExp(/[_-%]/); 
document.write(pattern.test("foo")); 

는이 작업을 수행이 정규 표현식에 대해 무엇입니까? 세 문자 (_, - 또는 %) 중 하나가 제거되면 모든 것이 정상적으로 작동합니다. 그리고 세 문자의 순서가 바뀌면 모든 것이 정상적으로 작동합니다.

+0

'%'와'_'를 바꾸면 효과가 있지만 예상대로되지 않을 것입니다 ('%'는 ASCII 45이고'_ '는 ASCII 137입니다.). – Reid

답변

6

범위에 [] 블록의 하이픈이 사용됩니다. 따라서 _에서 %까지는 유효하지 않습니다.

var pattern = new RegExp(/[_\-%]/); 

또는 시작 부분으로 이동 : 당신은 그것을 탈출 할 수

var pattern = new RegExp(/[-_%]/); 

또는 끝에 :

var pattern = new RegExp(/[_%-]/); 

정규식 알고 있기 때문에하는 시작에 하이픈 (또는 종료 , 감사 BrunoLM!)는 리터럴 하이픈을 의미하며 범위는 아닙니다.

+0

또는 끝에'[_ % -]' – BrunoLM

1

해석자가 범위를 처리하고 있다고 생각하기 때문입니다. /[a-z]/az 사이의 모든 문자와 일치하므로 _% 사이의 문자는 /[_-%]/ (일치)과 일치합니다 (시도). 이것은 의미가 없으므로 JavaScript가 중지됩니다. 첫 번째 또는 마지막 문자로 하이픈을 넣으면 문제가 해결됩니다.

+0

-와 함께 이스케이프하여 범위 의미론을 피하는 것도 가능합니다. –

0

중간에 대시가 있습니다. JavaScript는 [A-Z]과 비슷한 문자 클래스 범위로 [_-%]을 처리합니다. 사용중인 브라우저가이 케이스를 잘 처리하지 못한다고 생각합니다. 하이픈을 앞쪽으로 옮기거나 백 슬래시 (\-)로 이스케이프 처리하는 것이 좋습니다.

0

를 사용하는 대신 다음

/[-_%]/ 

은 - 범위로 해석되었을 것입니다. \ -

관련 문제