2010-12-01 2 views
1

를 사용 http://jsfiddle.net/aEEUN/정규식 : 나는 더 backrefences 대 역 참조를 사용할 때, 나는 다른 결과를 얻을 왜 다른 결과를 역 참조

를 참조하십시오?

var str = "Hello World\nHello   "; 
document.write("Without backreference: <br />"); 
var match = str.match(/\S(?![\s\S]*\S)/); 
document.write("- match.index: " + match.index + "<br />"); // index is 16 

document.write("With backreference: <br />"); 
var match = str.match(/(\S)(?![\s\S]*\1)/); 
document.write("- match.index: " + match.index); // index is 6 

답변

5

차이점은 두 문자를 완전히 똑같이 구속한다는 것입니다.

첫 정규 표현식에서 없을해야하는 다음 공백이 아닌 문자 :

/\S(?![\s\S]*\S)/ 

이것은 기본적으로 다른 비 공백 문자 뒤에되지 않은 공백이 아닌 문자와 일치하는 것을 의미합니다 .

/(\S)(?![\s\S]*\1)/ 

이 :

"Hello World\nHello   " 
       ^no other non-whitespace character following 

그러나 두 번째 정규 표현식에 특정 문자가 그이 전에 일치 된 다음 것을이 아니어야합니다 : 그것은 단지 공백 뒤에 마지막 o 일치하는 이유 기본적으로 문자열의 나머지 부분에 다시 나타나지 않는 공백이 아닌 문자와 일치하는 것을 의미합니다. 즉, 처음 발견 한 후 다시 나타나지 않습니다 공백이 아닌 첫 번째 캐릭터로 W가 일치하는 이유는 다음과 같습니다

가 역 참조를 불리는 이유
"Hello World\nHello   " 
    ^no other “W” following 

: 당신은 이전에 일치하는 문자열을 참조합니다.

0

그건 이상한 정규 표현식입니다. 문자 클래스 [\s\S]은 모든 것과 일치합니까? 공간인가 비 공간인가? 정확하지는 않지만 후자의 예에서 \1은 처음에했던 것과 똑같은 문자를 참조해야합니다 (다시 비 공백이 아닌) ... 다른 결과를 줄 것입니다.