传递给“匹配”的电子邮件地址正则表达式 (RFC 5322) 不起作用

Email address regular expression (RFC 5322) passed in to `match` does not work

在GoogleChrome中成功匹配邮箱地址:

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

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

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

当您使用字符串时,反斜杠在读取字符串文字时被解释为转义序列,它们不会传递给 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,}))$/;