使用"new RegExp"和使用正斜杠表示法创建正则表达式有什么区别?

did*_*xga 16 javascript regex slash

使用new RegExp("regex");/same_regex/测试目标字符串之间有什么区别吗?我问这个问题,因为我在使用这两种方法时得到了不同的验证结果.以下是我用于验证电子邮件字段的代码段:


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");
  }

我得到了两个不一致的结果:


email matched regex1
email mismatched regex2

我想知道这里是否有任何差异,或者我在这个具体例子中省略了什么?
有关可执行示例,请参阅此处

Gum*_*mbo 13

如果使用构造函数创建新的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])?$")
Run Code Online (Sandbox Code Playgroud)

这是必要的,因为在JavaScript中任何未知的转义序列都\x被解释为x.所以在这种情况下,它\.被解释为..


Koo*_*Inc 11

/.../被称为正则表达式文字.new RegExp使用RegExp构造函数并创建正则表达式对象.

来自Mozilla的开发者页面

正则表达式文字在评估脚本时提供正则表达式的编译.当正则表达式保持不变时,使用它来获得更好的性能.

使用构造函数提供正则表达式的运行时编译.当您知道正则表达式模式将要更改时,或者您不知道该模式并从其他源(例如用户输入)获取该模式时,请使用构造函数.