使用“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”和使用正斜杠符号创建正则表达式有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

彻底搞懂反斜杠“”和正斜杠"/"的区别

对表单input输入框加特殊符号(正斜杠和反斜杠)校验

正斜杠(/)与反斜杠()区别

apache ant怎么把路径的斜杠换成正的

Linux中的正斜杆(/)和反斜杆(\)的作用

类名中的正斜杠[重复]