0

我看不出创建新的正则表达式对象或使用之间的区别,/.../ 因为如果我执行以下命令,我会得到:

真假

alert(/^\d{4}$/.test(obj.value)+" "+(new RegExp("^\d{4}$")).test(obj.value));

提前致谢

4

1 回答 1

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 解析器现在看不到\d,因为\在构造字符串常量期间消失了。

因此,通过将传递给 RegExp 构造函数的字符串中的 加倍\,您可以确保单个\存在到正则表达式实际被解释为这样的点。当您使用“本机”正则表达式语法 ( /.../) 时,您只需要一个\,因为正则表达式只解析一次。

于 2013-07-13T22:27:52.797 回答