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

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

if(msgg.match(reg)){
    console.log(1);
} else {
    console.log(0);
}


打印0或返回null。我不明白为什么它会起作用?用\代替,但用?代替。
是吗比其他任何东西都更特别?

最佳答案

将文字符号而不是字符串符号传递给构造函数,您的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开始,当第一个参数是RegExp并且存在第二个flags参数时,new RegExp(/ab+c/, 'i')不再引发TypeError(“从另一个构造一个RegExp时不能提供标志”)。而是根据参数创建一个新的RegExp。
  
  使用构造函数时,需要正常的字符串转义规则(当包含在字符串中时,在特殊字符前加\)。例如,以下等同:


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

10-04 15:48
查看更多