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

Performance issue while evaluating email address with a regular expression

本文关键字:性能 问题 电子邮件地址 正则表达式 评估      更新时间:2023-09-26

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

/^'w+(['.-]?'w+)*@'w+(['.-]?w+)*('.'w{2,3})+$/

Javascript代码:

var email = 'myname@company.com';
var pattern = /^'w+(['.-]?'w+)*@'w+(['.-]?w+)*('.'w{2,3})+$/;
if(pattern.test(email)){
    return true;
}

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

aseflj#$kajsdfklasjdfklasjdfklasdfjklasdjfaklsdfjaklsdjfaklsfaksdjfkasdasdklfjaskldfjjdkfaklsdfjlak@company.com

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

然而,当我尝试评估这封电子邮件时,它花费了太多时间,浏览器挂起。

asefljkajsdfklasjdfklasjdfklasdfjklasdjfaklsdfjaklsdjfaklsfaksdjfkasdasdklfjaskldfjjdkfaklsdfjlak@company.com1

(我最后加了com1

我确信正则表达式是正确的,但不确定为什么要花这么多时间来评估第二个示例。如果我提供一封长度较短的电子邮件,它会很快进行评估。参见以下示例

dfjjdkfaklsdfjlak@company.com1

请帮助我解决性能问题

您的正则表达式将陷入灾难性的回溯。由于(['.-]?'w+)*中的['.-]?是可选的,它使群退化为('w+)*,这是灾难性回溯的经典情况。

移除?解决了问题。

我还删除了字符类中.的多余转义,并对正则表达式进行了一些更改。

^'w+([.-]'w+)*@'w+([.-]'w+)*'.'w{2,3}$

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

实际上,regex也不支持国际化域名。