JavaScript的替换/正则表达式(JavaScript replace/regex)

2019-06-17 12:46发布

鉴于这一功能:

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到以下内容,然后在浏览器替换什么:

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

Answer 1:

你需要加倍逃避任何正则表达式的字符(一次字符串中的斜线和一次正则表达式):

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

否则,它会寻找行的结束和“TESTONE”(这不可能发现)。

就个人而言,我不是正则表达式构建的使用字符串这个原因的大风扇。 逃离那个的关卡的需要可能导致你喝酒。 我相信其他人会有不同的感受,但并喜欢写的正则表达式时饮用。



Answer 2:

在解释模式而言,有以下几种形式之间没有什么区别:

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


Answer 3:

你的正则表达式应该有摹修改:

var pattern = /[somepattern]+/g;

通知在最后的克。 它告诉替代品做全局替换。

你也不需要使用RegExp对象就可以构造如上面的图案。 实施例图案:

var pattern = /[0-9a-zA-Z]+/g;

的图案总是由/两边包围 - 与改性剂之后的最终/时,克改性剂是全球。

编辑:为什么它很重要,如果图案是变量? 在你的情况下,将功能类似这样(注意,模式仍然是一个变量):

var pattern = /[0-9a-zA-Z]+/g;
repeater.replace(pattern, "1234abc");

但是,你需要改变你的替换功能,以这样的:

this.markup = this.markup.replace(pattern, value);


文章来源: JavaScript replace/regex