이 기능이 주어지면 :
function Repeater(template) {
var repeater = {
markup: template,
replace: function(pattern, value) {
this.markup = this.markup.replace(pattern, value);
}
};
return repeater;
};
어떻게해야합니까 this.markup.replace()
세계적으로 대체? 여기에 문제가 있습니다. 다음과 같이 사용하면 :
alert(new Repeater("$TEST_ONE $TEST_ONE").replace("$TEST_ONE", "foobar").markup);
경고의 값은 “foobar $ TEST_ONE”입니다.
Repeater
다음으로 변경 하면 Chrome에서 아무것도 대체되지 않습니다.
function Repeater(template) {
var repeater = {
markup: template,
replace: function(pattern, value) {
this.markup = this.markup.replace(new RegExp(pattern, "gm"), value);
}
};
return repeater;
};
… 알림은 $TEST_ONE $TEST_ONE
입니다.
답변
RegExp 문자를 이중으로 이스케이프해야합니다 (문자열의 슬래시에 대해 한 번, regexp에 대해 한 번) :
"$TESTONE $TESTONE".replace( new RegExp("\\$TESTONE","gm"),"foo")
그렇지 않으면 줄의 끝과 ‘TESTONE'(찾지 못함)을 찾습니다.
개인적으로 저는 이런 이유로 문자열을 사용하여 정규 표현식을 구축하는 것을 좋아하지 않습니다. 필요한 탈출 수준에 따라 술을 마실 수 있습니다. 나는 다른 사람들이 정규식을 작성할 때 다르게 느끼고 술을 좋아한다고 확신합니다.
답변
패턴 해석 측면에서는 다음 형식간에 차이가 없습니다.
/pattern/
new RegExp("pattern")
replace
메서드를 사용하여 리터럴 문자열을 바꾸고 싶다면 정규 표현식 대신 문자열을 replace
.
그렇지 않으면 패턴에서 먼저 정규식 특수 문자를 이스케이프해야합니다.
function reEscape(s) {
return s.replace(/([.*+?^$|(){}\[\]])/mg, "\\$1");
}
// ...
var re = new RegExp(reEscape(pattern), "mg");
this.markup = this.markup.replace(re, value);
답변
정규식 패턴에는 g 수정자가 있어야합니다.
var pattern = /[somepattern]+/g;
끝에 g가 있습니다. 대체자에게 전역 대체를 수행하도록 지시합니다.
또한 위와 같이 패턴을 구성 할 수있는 RegExp 개체를 사용할 필요가 없습니다. 패턴 예 :
var pattern = /[0-9a-zA-Z]+/g;
패턴은 항상 양쪽에 /로 둘러싸여 있습니다.-최종 / 뒤에 수정자가 있으며 g 수정자는 전역입니다.
편집 : 패턴이 변수 인 경우 왜 중요합니까? 귀하의 경우에는 다음과 같이 작동합니다 (패턴은 여전히 변수입니다).
var pattern = /[0-9a-zA-Z]+/g;
repeater.replace(pattern, "1234abc");
그러나 교체 기능을 다음과 같이 변경해야합니다.
this.markup = this.markup.replace(pattern, value);