使用正则表达式评估电子邮件地址时出现性能问题

Pra*_*K M 5 javascript regex jquery email-client email-validation

我正在使用下面的正则表达式来验证电子邮件地址。

/^\w+([\.-]?\w+)*@\w+([\.-]?w+)*(\.\w{2,3})+$/
Run Code Online (Sandbox Code Playgroud)

JavaScript代码:

var email = 'myname@company.com';

var pattern = /^\w+([\.-]?\w+)*@\w+([\.-]?w+)*(\.\w{2,3})+$/;

if(pattern.test(email)){
    return true;
}
Run Code Online (Sandbox Code Playgroud)

当我提供以下无效电子邮件时,正则表达式会很快进行评估:

aseflj#$kajsdfklasjdfklasjdfklasdfjklasdjfaklsdfjaklsdjfaklsfaksdjfkasdasdklfjaskldfjjdkfaklsdfjlak@company.com
Run Code Online (Sandbox Code Playgroud)

(我#$在名称中间添加了)

但是,当我尝试评估此电子邮件时,它花费了太多时间,并且浏览器挂起。

asefljkajsdfklasjdfklasjdfklasdfjklasdjfaklsdfjaklsdjfaklsfaksdjfkasdasdklfjaskldfjjdkfaklsdfjlak@company.com1
Run Code Online (Sandbox Code Playgroud)

(我最后补充com1

我确定正则表达式是正确的,但不确定为什么要花这么多时间来评估第二个示例。如果我提供较短的电子邮件,它将很快得到评估。请参阅以下示例

dfjjdkfaklsdfjlak@company.com1
Run Code Online (Sandbox Code Playgroud)

请帮助我解决性能问题

nha*_*tdh 5

你的正则表达式遇到了灾难性的回溯。由于[\.-]?in([\.-]?\w+)*是可选的,它使得群退化为(\w+)*,这是灾难性回溯的典型案例。

删除即可?解决问题。

我还删除了内部字符类的多余转义.,并稍微更改了正则表达式。

^\w+([.-]\w+)*@\w+([.-]\w+)*\.\w{2,3}$
Run Code Online (Sandbox Code Playgroud)

请注意,许多新通用 TLD 的字符数超过 3 个。甚至一些扩展前的 gTLD 也超过 3 个字符,例如.info.

事实上,正则表达式也不支持国际化域名。