解析电子邮件到标题

时间:2016-12-06 08:53:20

标签: c# regex

好的,我目前在使用电子邮件解析器时面临一些困难

当我开始时,我测试过的大多数电子邮件都是类似以下的

"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

3 个答案:

答案 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)
                {

                }
            }