有人可以在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});)*$
当使用此正则表达式匹配字符串时,它可能会导致死循环,为什么?
提前致谢!
答案 0 :(得分:2)
我认为您应该拆分电子邮件地址,并将每个地址与正则表达式相匹配,以便匹配电子邮件。
使用','
将每个电子邮件地址与验证表达式匹配。
答案 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}));)*$