使用正则表达式从邮件中提取信息

时间:2014-02-06 11:43:29

标签: c# regex email extract

我想在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;)

我对正则表达式不太熟悉,所以我将不胜感激。

(顺便说一句,如果有一个更简单更简洁的解决方案,我很乐意听到!)

4 个答案:

答案 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;

  • \&LT; :&lt;是一个元字符,如果你想匹配它需要转义 字面上。
  • (。*?):以非贪婪的方式匹配所有内容并捕获它。
  • &GT; :&gt;是一个元字符,如果你想匹配它需要转义 字面上。

答案 3 :(得分:0)

我在RegexBuddy中尝试使用源文本的.NET风格,将其分解为命名捕获组,以便您可以使用match.Groups [“FROM”]。值等。

然后,您可以迭代匹配项以确定您的匹配项是否包含指定捕获组的值。在匹配可能不完整的文档之前,我已经使用过这种方法。

(?:From: .+<(?<FROM>.+)>)?(?:To: .+<(?<TO>.+)>)?(?:Subject: (?<SUBJECT>.+))?