代码之家  ›  专栏  ›  技术社区  ›  Abhishek Kumar

无法逃脱“?”但是“\”在javascript正则表达式中工作良好

  •  1
  • Abhishek Kumar  · 技术社区  · 7 年前

    我有以下示例(在节点中):

    var reg = new RegExp("aa\?b", 'g');
    var msgg = "aa?b"
    
    if(msgg.match(reg)){
        console.log(1);
    } else {
        console.log(0);
    }
    

    这将打印0或返回null。我不明白为什么会这样?替换为\但不适用于?。 是有些比其他任何东西都特别??

    2 回复  |  直到 7 年前
        1
  •  3
  •   Tim    7 年前

    你需要加倍逃跑,就像这样:

    var reg = new RegExp("aa\\?b", 'g');
    

    或使用RegExp文本:

     var reg = /aa\?b/g;
    

    原因是JavaScript字符串 "\?" 计算结果为 "?" 因为 ? 不是特殊的转义字符。因此,您的RegExp会收到一个文字问号,而不是转义问号。双重转义确保“\”按字面意思处理。

        2
  •  1
  •   connexo    7 年前

    通过 字面意义的 符号,而不是 一串 regexp工作的构造函数符号:

    var reg = new RegExp(/aa\?b/, 'g');
    var msgg = "aa?b"
    
    console.log(msgg.match(reg))

    从…起 MDN :

    有两种方法可以创建RegExp对象:文字表示法和构造函数。为了指示字符串,文字表示法的参数不使用引号,而构造函数的参数使用引号。因此,以下表达式创建相同的正则表达式:

    /ab+c/i;
    new RegExp('ab+c', 'i');
    new RegExp(/ab+c/, 'i');
    

    在计算正则表达式时,文字表示法提供正则表达式的编译。当正则表达式保持不变时,请使用文字表示法。例如,如果使用文字符号构造循环中使用的正则表达式,则不会在每次迭代中重新编译正则表达式。

    正则表达式对象的构造函数,例如, new RegExp('ab+c') ,提供正则表达式的运行时编译。当您知道正则表达式模式将要更改,或者您不知道该模式并且从其他源(如用户输入)获取它时,请使用构造函数。

    从ECMAScript 6开始, new RegExp(/ab+c/, 'i') 当第一个参数是RegExp而第二个flags参数存在时,不再抛出TypeError(“从另一个RegExp构造一个RegExp时无法提供标志”)。而是根据参数创建一个新的RegExp。

    使用构造函数时,需要常规的字符串转义规则(字符串中包含的特殊字符前面带有\时)。例如,以下是等效的:

    var re = /\w+/;
    var re = new RegExp('\\w+');