我正在使用以下正则表达式验证电子邮件。键入时UI会冻结。提前感谢
'^(?!.*([.+_-])\\1)((?:[a-zA-Z0-9]+[a-zA-Z0-9.+_-]*)*[a-zA-Z0-9])+@((?:[a-zA-Z0-9]+[a-zA-Z0-9-]*)*[a-zA-Z0-9])(?:\\.(?:[a-zA-Z][a-zA-Z0-9]*){2,63})+$'
答案 0 :(得分:0)
这是一个由量化模式组成的灾难性回溯案例,其中第一个是强制性的,第二个是可选的。
基本上,您可以替换
((?:[a-zA-Z0-9]+[a-zA-Z0-9.+_-]*)*[a-zA-Z0-9])+
与
[a-zA-Z0-9][a-zA-Z0-9.+_-]*[a-zA-Z0-9]
并且您的模式将停止冻结代码执行。但是,尾随部分(?:\\.(?:[a-zA-Z][a-zA-Z0-9]*){2,63})+
看起来也很奇怪。您可以将其缩减为(?:\\.[a-zA-Z][a-zA-Z0-9]*)+
,因为{2,63}
限制在这里没有意义。
使用
'^(?!.*([.+_-])\\1)[a-zA-Z0-9][a-zA-Z0-9.+_-]*[a-zA-Z0-9]@[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9](?:\\.[a-zA-Z][a-zA-Z0-9]*)+$'