使用正则表达式评估电子邮件地址时出现性能问题
Performance issue while evaluating email address with a regular expression
我正在使用以下正则表达式来验证电子邮件地址。
/^\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+)*
,这是灾难性回溯的 classic 案例。
删除 ?
解决了问题。
我还删除了字符 class 中 .
的冗余转义,并稍微更改了正则表达式。
^\w+([.-]\w+)*@\w+([.-]\w+)*\.\w{2,3}$
请注意,许多新通用 TLD 的字符数超过 3 个。甚至有些扩展前的 gTLD 也超过了 3 个字符,例如 .info
.
事实上,正则表达式也不支持国际化域名。
我正在使用以下正则表达式来验证电子邮件地址。
/^\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+)*
,这是灾难性回溯的 classic 案例。
删除 ?
解决了问题。
我还删除了字符 class 中 .
的冗余转义,并稍微更改了正则表达式。
^\w+([.-]\w+)*@\w+([.-]\w+)*\.\w{2,3}$
请注意,许多新通用 TLD 的字符数超过 3 个。甚至有些扩展前的 gTLD 也超过了 3 个字符,例如 .info
.
事实上,正则表达式也不支持国际化域名。