我看不出创建新的正则表达式对象或使用之间的区别,/.../
因为如果我执行以下命令,我会得到:
真假
alert(/^\d{4}$/.test(obj.value)+" "+(new RegExp("^\d{4}$")).test(obj.value));
提前致谢
我看不出创建新的正则表达式对象或使用之间的区别,/.../
因为如果我执行以下命令,我会得到:
真假
alert(/^\d{4}$/.test(obj.value)+" "+(new RegExp("^\d{4}$")).test(obj.value));
提前致谢
当您从字符串创建 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 解析器现在看不到\d
,因为\
在构造字符串常量期间消失了。
因此,通过将传递给 RegExp 构造函数的字符串中的 加倍\
,您可以确保单个\
存在到正则表达式实际被解释为这样的点。当您使用“本机”正则表达式语法 ( /.../
) 时,您只需要一个\
,因为正则表达式只解析一次。