我们有一个应用程序,我们使用以下RegEx
来验证电子邮件。
private string _regularExpression = @"^(("".+?"")|([0-9a-zA-Z](((\.(?!\.))|([-!#\$%&'\*\+/=\?\^`\{\}\|~\w]))*[0-9a-zA-Z])*))@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9}$";
Regex _reg = new Regex(_regularExpression);
但是我们在源代码中发送了错误的电子邮件:
abcd1090ihavenoidea.what.going.wrong.here
程序挂起。我们仍然无法找到我们在这里做错的部分?
答案 0 :(得分:3)
该程序挂起,因为使用此正则表达式,您将获得灾难性回溯。在 121 628 步骤后,它在Regex 101停止了。我尝试降低输入字符串以查看它是如何灾难性的:它花了 88 063 步骤来理解abcd1090ihav.w
不是有效的电子邮件。
由于您使用的是c#,因此您可以阅读:
答案 1 :(得分:1)
编辑虽然我不认为正则表达式是验证电子邮件的正确工具,但如果OP更喜欢使用它,我会发现以下来自HERE的长图案最好的比赛。该网站专门用于正则表达式解决方案:
^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$