2012-10-12 4 views
2

나는이 문제를 단순화했습니다. 내가 크롬에서 다음 코드를 실행하면
나는 이상한 행동을 얻을 :JavaScript 정규식 이상한 행동

var a = "$&"; 
var b = "aba"; 

var c = b.replace(/a/, a); 

console.log(c); // expected output is: "$&b$&" 
       // but output is:  "aba" 

을하지만 다음 코드를 실행하면 내가 예상 출력

var a = "c"; 
var b = "aba"; 

var c = b.replace(/a/, a); 

console.log(c); // expected output is: "cbc" 
       // and output is:  "cbc" 

모든 아이디어를 어떻게이 문제를 해결하는 방법을 얻을?
이것은 버그입니까?
몇 가지 방법으로 변수 a의 문자열을 이스케이프해야합니까?

+0

죄송합니다, 예상 출력은'$ & ba'해야한다 and cba' –

답변

4

$을 대체 문자열로 사용하려면 $$을 사용하여 이스케이프 처리해야합니다. The $ character is used as a backreference :

var a, 
    b, 
    c; 
a = "$$&"; 
b = "aba"; 
c = b.replace(/a/, a); 
console.log(c); //$&ba 

당신이 문자열에서 패턴의 모든 인스턴스를 교체하려는 경우, 당신은 mark the regular expression as being global 필요 :

var a, 
    b, 
    c; 
a = "$$&"; 
b = "aba"; 
c = b.replace(/a/g, a); 
console.log(c); //$&b$& 
+0

+1 글로벌 교체에 대해 잘 알고 있습니다. – JDB

+0

답장을 보내 주셔서 감사합니다. 수동으로하는 것 외의 방법으로'$'를 esacepe하는 방법이 있습니까? 예 : 변수'a'의 내용이 외부의 리 소스로부터로드되고있는 경우. –

+1

@PatrickSchmidt, 확실히 정규식 바꾸기를 사용하십시오! 'a = a.replace (/ \ $/g, '$$$$');'. – zzzzBov

2

$은 역 참조 문자입니다. 문자열 바꾸기에는 특별한 의미가 있습니다.
JavaScript - string regex backreferences

또는 더 유용하게, 더 자세한 설명서이 페이지를 방문하십시오 :

이 관련 질문을 참조하십시오
http://www.regular-expressions.info/javascript.html#replace

교체 문제를 해결하려면를 시도 :

var a = "$$&"; 
var b = "aba"; 

var c = b.replace(/a/g, a); 

편집 : 글로벌 대체 문자를 잊어 버렸습니다. 추가됨.

0

두 isues을 :

(1) 교체 할 경우 모든 경우에 /g 수정자를 사용해야합니다.

(2) 문자열 $&은 패턴 matc 시간, 당신은 그 자체로 경기를 교체했다 있도록

것은 >> ... 다른 하나 달러 기호를 탈출하여 코드를 수정해야 함께 넣어

var a = "$$&"; 
var b = "aba"; 
var c = b.replace(/a/g, a);