我有一个表达式来验证电子邮件地址:

string REGEX_EMAIL = @"^\w+([\.\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\¦\}\~]*\w+)*@\w+([\.\-]\w+)*\.\w+([\.\-]\w+)*$";

如果地址正确,则IsMatch()方法会迅速显示真实结果。但是,如果地址字符串太长和错误,则此方法将挂起。

我该怎么做才能提高这种方法的速度?

谢谢。

最佳答案

您正在进行的几件事正在损害此正则表达式的性能。

  • Catastrophic backtracking
  • Too many optional statements

  • 您绝对可以在几个关键位置使用+而不是*来提高性能,但是,这当然会更改正则表达式将匹配和不匹配的内容。因此,我发现的最简单的解决方案实际上已在上述灾难性的回溯文章中进行了介绍。在这种情况下,您可以使用非回溯子表达式来大大提高性能,而无需以任何重要的方式改变正则表达式的行为。

    非回溯子表达式看起来像这样... (?>pattern)
    因此,请尝试使用以下正则表达式:
    ^\w+(?>[\.\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\¦\}\~]*\w+)*@\w+([\.\-]\w+)*\.\w+([\.\-]\w+)*$
    

    在一个稍微相关的主题上,我检查有效电子邮件地址的理念略有不同。例如,您会发现,像这样的长正则表达式可能会出现性能问题。

    其次,电子邮件地址国际化的即将到来的希望使这一切变得更加复杂。

    最后,任何基于正则表达式的电子邮件验证的主要目的是捕获拼写错误和公然尝试,以在不输入真实电子邮件地址的情况下通过表单。但是要检查电子邮件地址是否真实,您需要向该地址发送电子邮件。

    所以我的理念是在接受太多方面犯错。实际上,这是一件非常简单的事情...
    ^.+@.+\..+$
    

    这应该匹配任何可能有效的电子邮件地址,以及一些无效的电子邮件地址。

    关于c# - 为什么Regex IsMatch()挂起,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8316284/

    10-13 08:00