代码之家  ›  专栏  ›  技术社区  ›  core

JavaScript替换/regex

  •  84
  • core  · 技术社区  · 15 年前

    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 .

    3 回复  |  直到 11 年前
        1
  •  159
  •   seth    15 年前

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

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

    就个人而言,出于这个原因,我不太喜欢使用字符串构建regexp。所需要的逃跑程度可能会导致你喝酒。我相信其他人会有不同的感受,他们在写正则表达式时喜欢喝酒。

        2
  •  91
  •   harto    14 年前

    就模式解释而言,以下形式之间没有区别:

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

    如果要使用 replace 方法,我认为您只需将字符串而不是regexp传递给 代替 .

    否则,您必须首先转义模式中的任何regexp特殊字符-可能是这样的:

    function reEscape(s) {
        return s.replace(/([.*+?^$|(){}\[\]])/mg, "\\$1");
    }
    
    // ...
    
    var re = new RegExp(reEscape(pattern), "mg");
    this.markup = this.markup.replace(re, value);
    
        3
  •  36
  •   Darko    15 年前

    您的正则表达式模式应具有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);