我想在c#中使用正则表达式从电子邮件中提取一些信息。
以下是电子邮件中的简短摘录:
...with mapi id 14.02.0387.000; Thu, 6 Feb 2014 09:09:33 +0100
From: site <site@company.dk>
To: "nonexistingmail@doesnotexist127.dk" <nonexistingmail@doesnotexist127.dk>
Subject: can this bounce
Thread-Topic: can this bounce
Thread-Index: Ac8jEr8t3k2RouQ1RaGPCXGFcE5oNg==Date:...
我想从&#34;中提取&#34; <>
,&#34; To&#34;之间的地址<>
与主题之间的地址(在示例中,主题是&#34;可以反弹&#34;)
我对正则表达式不太熟悉,所以我将不胜感激。
(顺便说一句,如果有一个更简单更简洁的解决方案,我很乐意听到!)
答案 0 :(得分:1)
使用LINQ的解决方案:
var fromAddress = new string(msg.SkipWhile(c => c != '<').Skip(1).TakeWhile(c => c != '>').ToArray());
var toAddress = new string(msg.Substring(msg.IndexOf("To")).SkipWhile(c => c != '<').Skip(1).TakeWhile(c => c != '>').ToArray());
var subject = new string(msg.Substring(msg.IndexOf("Subject")).SkipWhile(c => c != ' ').Skip(1).TakeWhile(c => c != 'T').ToArray());
答案 1 :(得分:1)
使用正则表达式的完整运行示例:
我使用模式和3组:
@"[Ff]rom:[^<]*\<([^@]+@[^>]+)>[Tt]o:[^<]*\<([^@]+@[^>]+)>[Ss]ubject: ?(.*)Thread-Topic"
)
string source = "...with mapi id 14.02.0387.000; Thu, 6 Feb 2014 09:09:33 +0100From: site <site@company.dk>To: \"nonexistingmail@doesnotexist127.dk\" <nonexistingmail@doesnotexist127.dk>Subject: can this bounceThread-Topic: can this bounceThread-Index: Ac8jEr8t3k2RouQ1RaGPCXGFcE5oNg==Date:...";
Regex pattern = new Regex("[Ff]rom:[^<]*\\<([^@]+@[^>]+)>[Tt]o:[^<]*\\<([^@]+@[^>]+)>[Ss]ubject: ?(.*)Thread-Topic");
MatchCollection mc = pattern.Matches(source);
string partFrom = ""; string partTo = ""; string subject = "";
if(mc.Count>0)
{
partFrom = mc[0].Groups[1].Value;
partTo = mc[0].Groups[2].Value;
subject = mc[0].Groups[3].Value;
}
Console.WriteLine("From: " + partFrom + " To: " + partTo + " Subject: " + subject);
我检查我的表达式中的符号(@)是否存在内部邮件,并以单一模式提取所有部分 如果要查找仅邮件地址,可以使用此正则表达式:
@"\<[^>@]+@[^>]+>"
答案 2 :(得分:0)
\≤(?*)&GT;
答案 3 :(得分:0)
我在RegexBuddy中尝试使用源文本的.NET风格,将其分解为命名捕获组,以便您可以使用match.Groups [“FROM”]。值等。
然后,您可以迭代匹配项以确定您的匹配项是否包含指定捕获组的值。在匹配可能不完整的文档之前,我已经使用过这种方法。
(?:From: .+<(?<FROM>.+)>)?(?:To: .+<(?<TO>.+)>)?(?:Subject: (?<SUBJECT>.+))?