电子邮件验证正则表达式导致灾难性的回溯

时间:2017-03-09 06:09:38

标签: regex email-validation

我正在使用以下正则表达式进行电子邮件验证

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

这个正则表达式适用于小输入,但对于较长的输入(120个字符),这会导致灾难性的回溯。

是否可以优化此表达式?

1 个答案:

答案 0 :(得分:2)

注意:您的表达过于严格,请考虑使用类似<input> type="email" HTML5属性的内容。

当使用两个子模式时,第一个是可选模式,在无限量化的组中,如在([\.-]?\w+)*中,几乎总是导致灾难性的回溯,输入与模式不匹配。

也就是说,当用户名和域部分中包含大量单词字符,且模式与字符串不匹配时,就会出现问题 - 请参阅the regex failure demo somethingverylong@hereandthereseemore-.com字符串。

您需要做的是确保没有像

这样的模式
( <PATTERN_MATCHING_EMPTY_STRING> <PATTERN_MATCHING_1+_CHARS>) *

( a? bcd ) *
( a* bcd ) +
( a? b+ ) *?

在其他模式中。

您可以通过简单地强制使用可选模式来修复它们,并在适当的时候调整组量词:

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

请参阅regex demo。现在,[.-]是强制性的,它恰好匹配.-的一次出现。