我有以下示例(在节点中):
var reg = new RegExp("aa\?b", 'g');
var msgg = "aa?b"
if(msgg.match(reg)){
console.log(1);
} else {
console.log(0);
}
这将打印0或返回null。我不明白为什么会这样?被替换为\但不是在?的情况下。 是吗?有些比别人更特别吗?
答案 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+');