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

时间:2018-01-20 12:47:43

标签: javascript regex

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

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 个答案:

答案 0 :(得分:3)

你需要双重逃避,就像这样:

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

或使用RegExp文字:

 var reg = /aa\?b/g;

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

答案 1 :(得分:1)

文字表示法而不是字符串表示法传递给正则表达式的构造函数:

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开始,当第一个参数是RegExp且第二个flags参数存在时,new RegExp(/ab+c/, 'i')不再抛出TypeError(“当从另一个构造一个RegExp时不能提供标志”)。而是创建了参数中的新RegExp。

     

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

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