我正在使用以下正则表达式进行电子邮件验证
^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$
这个正则表达式适用于小输入,但对于较长的输入(120个字符),这会导致灾难性的回溯。
是否可以优化此表达式?
答案 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。现在,[.-]
是强制性的,它恰好匹配.
或-
的一次出现。