任何人都可以告诉我为什么这个C#电子邮件验证正则表达式(正则表达式)挂起?

我从电子邮件正则表达式中获得了一个很好的email vaidation正则表达式

    public static void Main(string[] args)
    {
        string value = @"cvcvcvcvvcvvcvcvcvcvcvvcvcvcvcvcvvccvcvcvc";
        var regex = new Regex(
            @"^([0-9a-zA-Z]([-.w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-w]*[0-9a-zA-Z].)+[a-zA-Z]{2,9})$",
            RegexOptions.Compiled);
        var x = regex.Match(value); // Hangs here !?!
        return;
    }

它在大多数情况下工作,但上面的代码挂起,燃烧100%的CPU ......我已经在W8地铁应用程序中测试过。 和一个标准的.Net 4.5应用程序。

任何人都可以告诉我为什么发生这种情况,如果有一个好的电子邮件验证REGEX没有挂起,或者有什么方法可以解决这个问题?

非常感谢,Jon


解释为什么它挂起:灾难性的回溯。

让我们简化正则表达式的关键部分:

(w*[0-9a-zA-Z])*@

你有

  • 一个可选部分w* ,它可以与下面的部分[0-9a-zA-Z]匹配相同的字符,所以这两个组合在本质上转换为w+
  • 嵌套量词: (w+)*
  • 这意味着,在s = "cvcvcvcvvcvvcvcvcvcvcvvcvcvcvcvcvvccvcvcvc"情况下,正则表达式的这部分需要在决定不匹配之前检查s (在2**(len(s)-1)处的所有可能的排列) @未找到。

    由于您无法使用任何正则表达式验证电子邮件地址(规范中存在太多的角落案例),因此通常最好

  • 做一个最小化的正则表达式检查( ^.*@.*$
  • 使用解析器来检查有效性(如@ Fake.It.Til.U.Make.It建议)
  • 尝试并发送电子邮件 - 即使一个看似有效的地址可能是假的,所以你必须这样做。
  • 为了完整性,您可以借助原子组避免回溯问题:

    var regex = new Regex(
        @"^([0-9a-zA-Z](?>[-.w]*[0-9a-zA-Z])*@(?>[0-9a-zA-Z][-w]*[0-9a-zA-Z].)+[a-zA-Z]{2,9})$",
        RegexOptions.Compiled);
    

    永远不要使用regex来验证电子邮件..

    您可以使用MailAddress类来验证它

    try 
    {
        address = new MailAddress(address).Address;
       //address is valid
    } 
    catch(FormatException)
    {
        //address is invalid
    }
    

    猜测这是因为正则表达式中的[ - 。 w],请尝试使用这个:

    ^[a-zA-Z0-9_-]+(?:.[a-zA-Z0-9_-]+)*@(?:([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([a-zA-Z0-9-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$
    

    此外,在.net 4.5 EmailAttribute应该可用,但不知道

    链接地址: http://www.djcxy.com/p/92781.html

    上一篇: Can anyone tell me why this C# email validation regular expression (regex) hangs?

    下一篇: Why does this regex for emails not work