我的正则表达式不起作用

时间:2013-07-13 22:24:58

标签: javascript regex object

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

true false

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

提前致谢

1 个答案:

答案 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构造函数的字符串中的\加倍,可以确保单个\存活到正则表达式实际解释为此的点。当您使用“本机”正则表达式语法(/.../)时,您只需要一个\,因为正则表达式只被解析一次。