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

Email validation Regular expression is causing catastrophic backtracking

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

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

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

是否可以优化这个表达式?

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

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

也就是说,当用户名和域部分中有很多单词字符,并且模式无法匹配字符串时,就会出现问题 - 请参阅 the regex failure demosomethingverylong@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。现在,[.-] 是强制性的,它恰好匹配 1 次出现的 .-.