[javascript] 자바 스크립트 교체 / 정규식

이 기능이 주어지면 :

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);


답변