传递给`match`的电子邮件地址正则表达式(RFC 5322)不起作用

时间:2017-03-23 16:38:14

标签: javascript regex v8

在谷歌浏览器中,这成功匹配电子邮件地址:

console.log('teddy@bear.com'.match(/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/));

而这不是:

const regex = '^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$';
console.log('teddy@bear.com'.match(regex));

唯一的区别是后者有通过变量传入的正则表达式而不使用正斜杠。

我想知道如何让后者工作。

1 个答案:

答案 0 :(得分:0)

当您使用字符串时,在读取字符串文字时,反斜杠将被解释为转义序列,并且它们不会传递给RegExp构造函数。你需要逃避它们以保持它们在字符串中。

const regex = '^(([^<>()\\[\\]\\\\.,;:\\s@"]+(\\.[^<>()\[\]\\\\.,;:\\s@"]+)*)|(".+"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$';

我不确定为什么要使用字符串文字来执行此操作。如果您想将正则表达式放在变量中,您仍然可以使用RegExp字面值。

const regex = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;