JavaScript replace/regex

2022-08-30 04:16:53

给定此函数:

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”。

如果我更改为以下内容,则Chrome中没有替换任何内容:Repeater

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


答案 1

您需要对任何正则表达式字符进行双重转义(一次用于字符串中的斜杠,一次用于正则表达式):

  "$TESTONE $TESTONE".replace( new RegExp("\\$TESTONE","gm"),"foo")

否则,它会查找行的末尾和“TESTONE”(它永远不会找到)。

就个人而言,出于这个原因,我不是使用字符串构建正则表达式的忠实粉丝。所需的逃避程度可能会导致您喝酒。我相信其他人有不同的感觉,喜欢在写正则表达式时喝酒。


答案 2

在模式解释方面,以下形式之间没有区别:

  • /pattern/
  • new RegExp("pattern")

如果你想使用该方法替换一个文字字符串,我认为你可以将字符串而不是正则表达式传递给 .replacereplace

否则,您必须首先转义模式中的任何正则表达式特殊字符 - 也许如下所示:

function reEscape(s) {
    return s.replace(/([.*+?^$|(){}\[\]])/mg, "\\$1");
}

// ...

var re = new RegExp(reEscape(pattern), "mg");
this.markup = this.markup.replace(re, value);