好的,我目前在使用电子邮件解析器时面临一些困难
当我开始时,我测试过的大多数电子邮件都是类似以下的
"name@domain.co.za, othername@domain.co.za"
这个我可以用逗号分开,但我得到以下不起作用的案例
1)"\"Surname, Name, Company Country\" <name.surname@domain.co.za>"
我试过以下
Regex.Split(Headers["to"] ?? "", "(?<=@\\S*)\\s+");
但是这不会删除逗号,所以我使用.Trim(',')删除尾随的逗号然后一些情况下工作
有效的示例
"name@domain.co.za, othername@domain.co.za"
例如以下内容不起作用
2)"\"Name Surname <name@domain.co.za>\" <name@domain.co.za>"
我还尝试使用Regex.Split(Headers["to"] ?? "", ",(?:^|,)(\"(?:[^\"]+|\"\")*\"|[^,]*)");
但它在以下情况下失败了
"\"Name Surname\" <Name@domain.co.za>, \"Name Surname\" <Othername@domain.co.za>"
现在使用新的正则表达式(?:""([^""]+)"")?\s*<?\b(\S+@\S+\.\S+)\b
它非常接近,使用以下的exaple我得到以下输出
输入:"\"Donald Jansen\" <Donald@peachss.co.za>, \"Donald Jansen\" <djhabana@gmail.com>"
输出
"\"Donald Jansen\" <Donald@peachss.co.za
\"Donald Jansen\" <djhabana@gmail.com
所以它忽略了跟踪>
,我通过将>?
添加到正则表达式来修复此问题,我还发现了一个无效的新方案,因此正则表达式现在为(?:"([^"]+)")?\s*<?\b(\S+@\S+\.\S+)\b>?
< / p>
"name <name@xxx.co.za>, name name <name@xxx.co.za>, name <name@xxx.co.za>, \"'name'\" <name@xxx.com>"
现在的输出是
<name@xxx.co.za> << not correct name is needed
<name@xxx.co.za> << not correct name is needed
<name@xxx.co.za> << not correct name is needed
\"'name'\" <name@xxx.com>" << this is correct
答案 0 :(得分:1)
这可能会在字符串中找到所有有效的电子邮件。
Regex emailRegex = new Regex(@"\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", RegexOptions.IgnoreCase);
MatchCollection emailMatches = emailRegex.Matches(data);
foreach (Match emailMatch in emailMatches)
{
Console.WriteLine(emailMatch.Value);
}
答案 1 :(得分:0)
您可以使用&#39;电子邮件正则表达式&#39;来自emailregex.com
[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?
答案 2 :(得分:0)
感谢@MohitShrivastava和@WiktorStribiżew的帮助,我设法使用他们提供的正则表达式组合构建我自己的正则表达式,它可能没有优化,有点难看,但它正如我期望的那样工作
((\w+[ ])|\"(.*?)\"+[ ])+(<?\b(\S+@\S+\.\S+)\b>)|(\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)
示例代码
var emailRegex = new Regex(@"((\w+[ ])|\""(.*?)\""+[ ])+(<?\b(\S+@\S+\.\S+)\b>)|(\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)", RegexOptions.IgnoreCase);
var emailMatches = emailRegex.Matches(Headers["to"]);
foreach (Match emailMatch in emailMatches)
{
try
{
To.Add(new MailAddress(emailMatch.Value));
}
catch (Exception ex)
{
}
}