JavaScript替换/正则表达式

cor*_*ore 100 javascript regex replace

鉴于此功能:

function Repeater(template) {

    var repeater = {

        markup: template,

        replace: function(pattern, value) {
            this.markup = this.markup.replace(pattern, value);
        }

    };

    return repeater;

};
Run Code Online (Sandbox Code Playgroud)

如何this.markup.replace()全球更换?这是问题所在.如果我像这样使用它:

alert(new Repeater("$TEST_ONE $TEST_ONE").replace("$TEST_ONE", "foobar").markup);
Run Code Online (Sandbox Code Playgroud)

警报的值为"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;

};
Run Code Online (Sandbox Code Playgroud)

......警报是$TEST_ONE $TEST_ONE.

set*_*eth 134

你需要双重转义任何RegExp字符(一次用于字符串中的斜杠,一次用于regexp):

  "$TESTONE $TESTONE".replace( new RegExp("\\$TESTONE","gm"),"foo")
Run Code Online (Sandbox Code Playgroud)

否则,它会查找该行的结尾和'TESTONE'(它从未找到).

就个人而言,由于这个原因,我不是建立regexp使用字符串的忠实粉丝.逃脱的水平可能导致你喝酒.我确信其他人会有不同的感受,并且在写正则表达时喜欢喝酒.

  • @Chris - 如果你使用`/ pattern /`或`new RegExp("pattern")`,我觉得它没有什么区别. (7认同)

har*_*rto 70

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

  • /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);
Run Code Online (Sandbox Code Playgroud)

  • 之前不知道,/ pattern /与新的RegExp("模式")相同.真有帮助! (10认同)
  • 说正则表达式文字(/ regex /)与RegExp(“ regex”)相同是不准确的。在正则表达式文字中,反斜线('\')本身不需要转义('\\')即可使其成为正则表达式的一部分。此外,可以在解析脚本时而不是每次执行函数时编译正则表达式文字。为了匹配反向固相线,您可以编写/ \\ /或RexExp(“ \\\\”)。 (2认同)

Dar*_*o Z 28

你的正则表达式模式应该有g修饰符:

var pattern = /[somepattern]+/g;
Run Code Online (Sandbox Code Playgroud)

最后注意到g.它告诉替换者进行全局替换.

此外,您不需要使用RegExp对象,您可以构建您的模式,如上所述.示例模式:

var pattern = /[0-9a-zA-Z]+/g;
Run Code Online (Sandbox Code Playgroud)

一个模式总是被/在任何一侧包围 - 在最终的/之后使用修饰符,g修饰符是全局的.

编辑:为什么模式是一个变量?在你的情况下它会像这样运作(注意模式仍然是一个变量):

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

但是您需要将替换功能更改为:

this.markup = this.markup.replace(pattern, value);
Run Code Online (Sandbox Code Playgroud)