【问题标题】:Need help with regular expression to parse a string of e-mail addresses in C#需要正则表达式的帮助来解析 C# 中的电子邮件地址字符串
【发布时间】:2009-09-29 09:26:26
【问题描述】:

有人可以用 C# 编写一个正则表达式来让我验证以下电子邮件吗?

aa@bb.com;cc@dfs.com;asdf@fasdf.com;sdfsdf@fsaf.com;

每个电子邮件地址都用“;”分隔,我写了以下正则表达式:

^(([0-9a-zA-Z]([-\.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9});)*$

当使用这个正则匹配一个字符串时,可能会导致死循环,为什么?

提前致谢!

【问题讨论】:

  • 你有“死循环”的具体例子吗?
  • 我敢打赌,当他拥有一长串电子邮件地址并且缺少最后一个分号时,他会看到正则表达式引擎挂起。

标签: c# regex


【解决方案1】:

我认为您应该拆分电子邮件地址并将每个地址与正则表达式进行匹配以匹配电子邮件。

  1. 使用 ',' 分割电子邮件地址

  2. 将每个电子邮件地址与验证表达式匹配。

【讨论】:

  • 但是你知道为什么上面的正则表达式会导致问题吗?
  • 我真的很想知道为什么这会导致问题,因为我只是在电子邮件正则表达式的末尾添加一个“:”,然后用 ()* 括起来
【解决方案2】:

您的正则表达式受到catastrophic backtracking 的影响。我在你的正则表达式中添加了原子组来创建这个:

^(([0-9a-zA-Z](?>(?>[-\.\w]*[0-9a-zA-Z])*@)(?>(?>[0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9}));)*$

【讨论】:

    【解决方案3】:

    您的具体示例有效:

    string s = "aa@bb.com;cc@dfs.com;asdf@fasdf.com;sdfsdf@fsaf.com;";
    Regex re = 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});)*$");
    
    Console.WriteLine(re.IsMatch(s));
    

    打印“真”

    【讨论】:

      【解决方案4】:

      我无法使用您的示例在我的计算机上重现无限循环(我使用的是 .NET 3.5)。这是我使用的代码:

      Regex rex = 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});)*$");
      String emails = "aa@bb.com;cc@dfs.com;asdf@fasdf.com;sdfsdf@fsaf.com;";
      Boolean ismatch = rex.IsMatch(emails);
      Match match = rex.Match(emails);
      

      ismatch 结果为真,match 包含数据。

      您可能会对此问题感兴趣:How to avoid infinite loops in the .NET RegEx class?

      【讨论】:

        【解决方案5】:

        你可以试试这个

         \s*[;,]\s*(?!(?<=(?:^|[;,])\s*"(?:[^"]|""|\\")*[;,]\s*)(?:[^"]|""|\\")*"\s*(?:[;,]|$)) 
        

        此正则表达式拆分逗号或分号分隔的可选引号字符串列表。它还处理带引号的分隔符和转义的引号。引号内的空格被保留,引号外的空格被删除。

        希望这能满足您的要求

        谢谢

        ~阿莫德

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-23
          • 2013-04-09
          • 2011-03-27
          • 1970-01-01
          • 2014-05-12
          相关资源
          最近更新 更多