[英]Not able to escape “?” but “\” works fine in 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。 我不明白为什么它会起作用? 用\\代替,但用?代替。 是吗 比其他任何东西更特别?
您需要两次转义,如下所示:
var reg = new RegExp("aa\\?b", 'g');
或使用RegExp文字:
var reg = /aa\?b/g;
原因是JavaScript字符串"\\?"
评估为"?"
因为?
不是特殊的转义字符。 因此,您的RegExp会收到文字问号,而不是转义的问号。 两次转义可确保对“ \\”进行逐字处理。
将文字符号而不是字符串符号传递给构造函数,您的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而第二个标志参数时,
new RegExp(/ab+c/, 'i')
不再引发TypeError(“从另一个构造RegExp时不能提供标志”)存在。 而是根据参数创建一个新的RegExp。使用构造函数时,需要正常的字符串转义规则(当包含在字符串中时,在特殊字符前加\\)。 例如,以下等同:
var re = /\w+/;
var re = new RegExp('\\w+');
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.