我没有看到创建新的正则表达式对象或使用 /.../
之间的区别
因为如果我执行以下命令,我会得到:
真假
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
等。字符串常量是表达式的低级基本元素之一。解析器必须将字符串的源代码转换为运行时字符串值,这涉及读取引号之间的字符。记住,对于解析器的 string 部分来说,其中的 \d
意味着该字符串应包含“d”。 (“d”字符并不特殊,因此 \d
在字符串中确实没有做任何有趣的事情,但 \
仍然会被“吃掉”。)
现在我们已经有了表达式的基本构建 block ,因此在运行时可以使用解析器组装的字符串值调用 RegExp 构造函数。现在,是时候进行 RegExp 语法分析了。 RegExp 解析器现在看不到 \d
,因为 \
在字符串常量的构造过程中消失了。
因此,通过将传递给 RegExp 构造函数的字符串中的 \
加倍,可以确保单个 \
保留到正则表达式实际解释的位置像这样。当您使用“ native ”正则表达式语法 (/.../
) 时,您只需要一个 \
,因为正则表达式仅解析一次。
关于javascript - 我的正则表达式不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17634756/