使用“new RegExp”和使用正斜杠符号创建正则表达式有啥区别?
Posted
技术标签:
【中文标题】使用“new RegExp”和使用正斜杠符号创建正则表达式有啥区别?【英文标题】:What is the difference between using "new RegExp" and using forward slash notation to create a regular expression?使用“new RegExp”和使用正斜杠符号创建正则表达式有什么区别? 【发布时间】:2011-09-03 05:37:15 【问题描述】:使用new RegExp("regex");
和/same_regex/
对目标字符串进行测试有什么区别吗?我问这个问题是因为我在使用这两种方法时得到了不同的验证结果。这是我用来验证电子邮件字段的 sn-p:
var email="didxga@gmail.comblah@foo.com";
var regex1 = new RegExp("^[a-z0-9!#$%&'*+/=?^_`|~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`|~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$");
var regex2 = /^[a-z0-9!#$%&'*+/=?^_`|~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`|~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/;
//using RegExp object
if(regex1.test(email))
console.log("email matched regex1");
else
console.log("email mismatched regex1");
//using slash notation
if(regex2.test(email))
console.log("email matched regex2");
else
console.log("email mismatched regex2");
我得到了两个不一致的结果:
电子邮件匹配的正则表达式1 电子邮件不匹配的正则表达式2我想知道这里是否有任何区别,或者我在这个特定示例中省略了某些内容? 可执行示例请参考here
【问题讨论】:
【参考方案1】:如果你使用构造函数创建一个新的 RegExp 对象而不是文字语法,你需要正确地转义\
:
new RegExp("^[a-z0-9!#$%&'*+/=?^_`|~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`|~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$")
这是必需的,因为在 javascript 中,任何未知的转义序列 \x
都会被解释为 x
。所以在这种情况下,\.
被解释为.
。
【讨论】:
在斜线符号中`\`和`/`中的字符类定义也必须被转义。 @Philipp:/
是,但反斜杠不是。【参考方案2】:
/.../
被称为正则表达式文字。 new RegExp
使用 RegExp 构造函数并创建一个正则表达式对象。
来自Mozilla's developer pages
正则表达式字面量提供 正则表达式的编译 当脚本被评估时。当。。。的时候 正则表达式将保留 恒定,使用它更好 性能。
使用构造函数 提供运行时编译 正则表达式。使用 当你知道构造函数时 正则表达式模式将是 改变,或者你不知道 模式并从中得到它 另一个来源,例如用户输入。
【讨论】:
【参考方案3】:这将对您有所帮助 http://www.regular-expressions.info/javascript.html 请参阅“如何使用 JavaScript RegExp 对象”部分
如果你使用 RegExp(regx) regx 应该是字符串格式,例如:-
\w+ 可以创建为regx = /\w+/
或regx = new RegExp("\\w+")
。
【讨论】:
【参考方案4】:至少在你的情况下,不同之处在于逃避。 当你使用 // 表示法时,你必须用 '\/' 转义 '/',当你使用 Regexp 表示法时,你必须转义引号
【讨论】:
` / ` out of char 类定义也必须转义以上是关于使用“new RegExp”和使用正斜杠符号创建正则表达式有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章