正则表达式匹配挂起我的程序

时间:2016-03-17 13:00:15

标签: c# regex

我们有一个应用程序,我们使用以下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

程序挂起。我们仍然无法找到我们在这里做错的部分?

2 个答案:

答案 0 :(得分:3)

该程序挂起,因为使用此正则表达式,您将获得灾难性回溯。在 121 628 步骤后,它在Regex 101停止了。我尝试降低输入字符串以查看它是如何灾难性的:它花了 88 063 步骤来理解abcd1090ihav.w不是有效的电子邮件。

由于您使用的是,因此您可以阅读:

答案 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])+)\])$

REGEX DEMO

另请查看此网站:Stop Validating Email Addresses With Regex