需要有关正则表达式的帮助来解析C#中的一串电子邮件地址

时间:2009-09-29 09:26:26

标签: c# regex

有人可以在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});)*$

当使用此正则表达式匹配字符串时,它可能会导致死循环,为什么?

提前致谢!

5 个答案:

答案 0 :(得分:2)

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

  1. 使用','

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

答案 1 :(得分:0)

您的具体示例有效:

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));

打印“True”

答案 2 :(得分:0)

我无法使用您的示例在我的计算机上重现无限循环(我使用的是.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结果为true且匹配包含数据。

另一个问题:How to avoid infinite loops in the .NET RegEx class?可能会让您感兴趣。

答案 3 :(得分:0)

您可以尝试使用此

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

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

希望这符合您的要求

由于

~Aamod

答案 4 :(得分:0)

您的正则表达式会受到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}));)*$