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

标签 javascript jquery regex email-validation email-client

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

/^\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

请帮我解决性能问题

最佳答案

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

删除 ? 可解决问题。

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

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

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

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

关于javascript - 使用正则表达式评估电子邮件地址时出现性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29551388/

相关文章:

java - gradle基于复制创建新的java类

javascript - 从 json 转换为经典 asp

javascript - 如何使用javascript从span的data-summary属性中获取值

用于在提交时检查表单值的 Javascript 函数

Jquery 显示/隐藏 div

regex - 通过正则表达式从 URL 路径中提取数据

javascript - 如何在 React js 中扩展下拉菜单

jquery - 如何以json格式发送数据库查询结果并在javascript中显示结果?

javascript - 有人知道能够固定位置的 jQuery 鱼眼/停靠导航插件吗?

javascript - 使用 javascript 从字符串原型(prototype)返回值