我在网络应用程序的表单上发布了一个webhook帖子,我需要解析电子邮件标题地址。
以下是源文本:
Thread-Topic: test subject
Thread-Index: AcwE4mK6Jj19Hgi0SV6yYKvj2/HJbw==
From: "Lastname, Firstname" <firstname_lastname@domain.com>
To: <testto@domain.com>, testto1@domain.com, testto2@domain.com
Cc: <testcc@domain.com>, test3@domain.com
X-OriginalArrivalTime: 27 Apr 2011 13:52:46.0235 (UTC) FILETIME=[635226B0:01CC04E2]
我想提出以下内容:
<testto@domain.com>, testto1@domain.com, testto2@domain.com
我一整天都在与Regex挣扎,没有任何运气。
答案 0 :(得分:4)
与此处的一些帖子相反,我不得不同意mmutz,你无法使用正则表达式解析电子邮件...请参阅此文章:
http://tools.ietf.org/html/rfc2822#section-3.4.1
3.4.1。地址规范
addr-spec是特定的Internet 包含本地的标识符 解释后的字符串后跟 at符号字符(“@”,ASCII值 64)其次是互联网域名。
“本地解释”的概念意味着只有接收服务器才能够解析它。
如果我要尝试解决此问题,我会找到“To”行内容,将其拆分并尝试使用System.Net.Mail.MailAddress解析每个段。
static void Main()
{
string input = @"Thread-Topic: test subject
Thread-Index: AcwE4mK6Jj19Hgi0SV6yYKvj2/HJbw==
From: ""Lastname, Firstname"" <firstname_lastname@domain.com>
To: <testto@domain.com>, ""Yes, this is valid""@[emails are hard to parse!], testto1@domain.com, testto2@domain.com
Cc: <testcc@domain.com>, test3@domain.com
X-OriginalArrivalTime: 27 Apr 2011 13:52:46.0235 (UTC) FILETIME=[635226B0:01CC04E2]";
Regex toline = new Regex(@"(?im-:^To\s*:\s*(?<to>.*)$)");
string to = toline.Match(input).Groups["to"].Value;
int from = 0;
int pos = 0;
int found;
string test;
while(from < to.Length)
{
found = (found = to.IndexOf(',', from)) > 0 ? found : to.Length;
from = found + 1;
test = to.Substring(pos, found - pos);
try
{
System.Net.Mail.MailAddress addy = new System.Net.Mail.MailAddress(test.Trim());
Console.WriteLine(addy.Address);
pos = found + 1;
}
catch (FormatException)
{
}
}
}
上述程序的输出:
testto@domain.com
"Yes, this is valid"@[emails are hard to parse!]
testto1@domain.com
testto2@domain.com
答案 1 :(得分:1)
符合RFC 2822的电子邮件正则表达式是:
(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
只需在文字上运行即可获得电子邮件地址。
当然,总是可以选择不使用正则表达式,其中正则表达式不是最佳选择。但取决于你!
答案 2 :(得分:0)
你不能使用正则表达式来解析RFC2822邮件,因为它们的语法包含一个递归生成(在我的头顶,它用于注释(a (nested) comment)
),这使得语法不规则。正则表达式(顾名思义)只能解析常规语法。
有关详细信息,另请参阅RegEx match open tags except XHTML self-contained tags。
答案 3 :(得分:0)
正如Blindy所说,有时你可以用老式的方式解析它。
如果您愿意这样做,假设电子邮件标题文本称为“标题”,这是一种快速方法:
int start = header.IndexOf("To: ");
int end = header.IndexOf("Cc: ");
string x = header.Substring(start, end-start);
我可能会在减法中删除一个字节,但您可以非常轻松地测试和修改它。当然,你还必须确定你的标题中总是有一个Cc:行,否则这将不起作用。
答案 4 :(得分:0)
使用正则表达式here验证电子邮件的细分,引用了更实际的RFC 2822实现:
[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?
您似乎只想要“收件人”字段之外的电子邮件地址,并且您已经获得了&lt;&gt;也担心,所以像下面这样的东西可能会起作用:
^To: ((?:\<?[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\>?,?(?:\s*))*)
同样,正如其他人所提到的,你可能不想这样做。但是如果你想要将输入转换为<testto@domain.com>, testto1@domain.com, testto2@domain.com
的正则表达式,那就可以了。