2011-01-14 2 views
3

나는 Case insensitive string replacement in JavaScript?에서 코드를 다스 려하고있다 :

RegExp.escape = function(str) 
{ 
    var specials = new RegExp("[.*+?|()\\[\\]{}\\\\]", "g"); // .*+?|()[]{}\ 
    return str.replace(specials, "\\$&"); 
} 

\\$&은 무엇을 의미합니까?

\\\ 문자를 이스케이프 처리합니다. 그럼 $&, 나는 $1가 일치해야한다고 생각했습니다. tho $1이 올바르게 작동하지 않습니다.

답변

4

$&은 캡처 그룹과 상관없이 정규식과 일치하는 전체 (하위) 문자열을 나타냅니다. 당신이 얻는 교체 결과는 문자열에서 백 슬래시 (\\으로 표시)로 이스케이프 처리 된 각각의 일치 항목입니다. 여기에 사용 된 정규 표현식은 문자 클래스로만 구성되므로 "각 일치"는 일치하는 문자 클래스에 나열된 각 메타 문자를 참조합니다.

예를 들면, 정규식은 문자열 [abc]\[abc\] 대체한다 : 그것은 문자 클래스로 발생

  • [ 일치한다. $&로 표현, \[

  • a, bc로 문자 클래스 메타 문자가없는 대체, 그래서 문자 클래스에서 발생할 때 그들은 일치

  • ]

    을 무시하고 있습니다. $&에 의해 대표, 정규식 캡처 그룹을 사용하지 않는 것을 \]

0

이 예에서는 일치하는 특수 문자가 모두 일치합니다. $1은 그룹 (...)이 정규 표현식에 없기 때문에 작동하지 않습니다 (대괄호로 괄호를 추가 한 경우에도 작동합니다).

예, 첫 번째 '\'는 다른 문자를 이스케이프합니다 (일반적으로 백 슬래시는 특수 문자와 함께 사용되므로 리터럴 백 슬래시를 얻으려면 다른 백 슬래시를 사용하여 이스케이프 처리해야 함).

0

로 대체. 분명히 그는 일반적인 정규 표현식 변수 사용 : 그는 단지 s/[.*+?|()\[\]{}\\]/\\$&/g에 상응 한 번에 한 문자와 일치한다이 경우

$& returns the entire matched string (some systems its $0)

애매한 사실 : 함수 호출 quotemeta는 ("당신이 펄 문자열 ")이
하거나 \ Q를 사용하여 정규식에서 인라인 될 수 있습니다. 나는 Perl을 좋아한다.

부끄러움을 제외하고는 아마도 $ 이라는 캐럿을 버렸을 수도 있습니다. 내장 또는 인라인 방법이 없다는 사실은 좋지 않을 수 있습니다. 그리고 정규식 파편이 문제가 될 수 있으므로 이처럼 탈출 메타 캐는 생각해야합니다.

관련 문제