2014-10-25 2 views
0

을 나는 다음과 같은 문자열이 있습니다?. 내가 제거하면,왜 "("일치하지 정규식을 유발하는

var foo = "{(y-7)}({x + d})" 
var find = "{(y-7)}"; 
var replacement = "12"; 
var re = new RegExp(find, 'g'); 
foo = foo.replace(re, replacement); 

을하지만이 변경하지 않고, 동일한 문자열 결과 그러나 괄호가 즉 "("와 ")"는 표현에서, 다음은?

+0

괄호는 그룹화에 사용되는 특수 문자로, 이스케이프 처리해야하는 문자 괄호가 있습니다. –

답변

4
당신은 (을 탈출해야

) 그들이 가지고 있기 때문에 "("왜

왜 표현이 포함되어있는 경우 일치하지 않습니다. 작동하는 것 같다 special meaning in regex :

var find = "\\{\\(y-7\\)\\}" 

동일 이름은 { and }을 나타냅니다.

이 이스케이프는 정규식 (즉, find)에서만 발생해야하며 foo은 보통 문자열이므로 그대로 사용하면됩니다.

는 당신이 덜 이스케이프가 자바 스크립트의 기능 내장을 사용하는 것이 좋습니다 :

var re = /\{\(y-7\)\}/g; 

업데이트를

문자열은 그렇게 나에게 넘겨진다, 그래서 교체 할 필요가

var find = "{(y-7)}"; 
find = find.replace("\\", "\\\\") 
      .replace("(", "\\(").replace(")", "\\)") 
      .replace("{", "\\{").replace("}", "\\}"); 

나는 이것을 "도피 지옥"이라 부르지 만, 정규 표현식을 생성하는 것은 사소한 것이 아닙니다. 너는 운이 좋겠지 만. 먼저 사용법을 익히고 생성을 시도하는 것이 좋습니다.

+0

내 문자열 "find"등은 프로그래밍 방식으로 생성됩니다. –

+0

'find '도 생성되면 다음과 같은 코드가 있어야합니다 :'find = "("+ somevar + ")"' , 그곳에서'() {} '을 이스케이프 (백 슬래시 넣기) – TWiStErRob

+0

그럴 수 없다. 문자열이 나에게 넘겨 지므로 대체해야한다. –

4

정규 표현식에서 특별한 의미를 지닌 문자는 이스케이프해야합니다. 당신은 그들 앞에 백 슬래시를 넣어 그들을 탈출, 당신은 그것의 앞에 백 슬래시를 넣어 그 탈출 할 필요가 문자열에서 백 슬래시를 넣어 :

var find = "\\{\\(y-7\\)\\}"; 

(어떤 상황 문자에서 필요로하지 않는다 특별한 의미가있는 모든 문자를 이스케이프가없이 이해 될 수 있기 때문에, 정규 표현식에서 탈출하지만, 시작, 당신은 필요하지 않은 정확한 상황에 읽을 수 있습니다)

데모 :.

var foo = "{(y-7)}({x + d})" 
 
var find = "\\{\\(y-7\\)\\}"; 
 
var replacement = "12"; 
 
var re = new RegExp(find, 'g'); 
 
foo = foo.replace(re, replacement); 
 

 
// show result in StackOverflow snippet 
 
document.write(foo);

+0

"find"는 프로그래밍 방식으로 생성됩니다. 어떻게하면 "{"을 벗어날 수 있습니까? –

+1

@ 존 :'find = find.replace (/ ([?? * +^$ [\] \\() {} | -])/g, "\\ $ 1");'를 사용하여 문자를 이스케이프 할 수 있습니다. . 여기에 있습니다 : http://stackoverflow.com/questions/494035/how-do-you-pass-a-variable-to-a- regular-expression-javascript/494122#494122 – Guffa

관련 문제