我没有看到创建新的正则表达式对象或使用/.../
之间的区别
因为如果我执行以下操作,我会得到:
true false
alert(/^\d{4}$/.test(obj.value)+" "+(new RegExp("^\d{4}$")).test(obj.value));
提前致谢
答案 0 :(得分:4)
当您从字符串创建RegExp对象时,您必须考虑到字符串常量语法(如RegExp语法)将\
视为特殊字符这一事实:
alert(/^\d{4}$/.test(obj.value)+" "+(new RegExp("^\\d{4}$")).test(obj.value));
应该更好。请注意字符串版本中的\\
,而不是单个\
。
当你有类似
之类的东西时会发生什么var myRegExp = new RegExp( "blah blah \d blah blah" );
?首先,解析器必须查看表达式的低杠杆部分,如变量名称,=
符号,new
等。字符串常量是表达式的低级基本元素之一。解析器必须将字符串的源代码转换为运行时字符串值,这涉及读取引号之间的字符。那里的\d
将意味着 - 对于解析器的字符串部分,请记住 - 该字符串应包含“d”。 (“d”字符并不特殊,因此\d
在字符串中确实没有做任何有趣的事情,但\
仍会被“吃掉”。)
所以现在我们已经获得了表达式的基本构建块,因此在运行时可以使用解析器组装的字符串值调用RegExp构造函数。现在,是时候进行RegExp语法分析了。 RegExp解析器现在不会看到\d
,因为\
在构造字符串常量期间消失了。
因此,通过将传递给RegExp构造函数的字符串中的\
加倍,可以确保单个\
存活到正则表达式实际解释为此的点。当您使用“本机”正则表达式语法(/.../
)时,您只需要一个\
,因为正则表达式只被解析一次。