2014-02-06 50 views
0

我想在c#中使用正则表达式从电子邮件中提取一些信息。使用正则表达式从邮件中提取信息

这里是从电子邮件中的一小段:

...with mapi id 14.02.0387.000; Thu, 6 Feb 2014 09:09:33 +0100 
From: site <[email protected]> 
To: "[email protected]" <[email protected]> 
Subject: can this bounce 
Thread-Topic: can this bounce 
Thread-Index: Ac8jEr8t3k2RouQ1RaGPCXGFcE5oNg==Date:... 

我想提取“从”的<>之间的地址,“收件人” <>和主题(在本例之间的地址,主题是“can this bounce”)

我对正则表达式并不是很熟悉,所以我会很感激任何帮助。

(顺便说一句和,如果有一个更简单更巧妙的解决办法我会很高兴地听到!)使用LINQ

+0

http://hpop.sourceforge.net/ – nhahtdh

回答

1

:A液(。*?)

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()); 
+0

很整齐,和它的作品!现在唯一的问题是,实际邮件由许多行组成......并且满足LINQ表达式中的要求的第一行其实不是正确的,所以我需要跳过第一行。是否有办法使它选择字符串中的最后一行,而不是第一行? –

+0

你可以用'string.Substring'跳过第一行,例如'message.Substring(message.IndexOf(“startFromHere”))' –

0

\ <>

  • \ <:<是元字符,需要进行转义,如果你想匹配它 字面上。
  • (。*?):以非贪婪的方式匹配所有内容并捕获它。
  • >:>是一个元字符,需要转义,如果你想从字面上匹配 。
1

全运行例如使用正则表达式:
我用图案与3组:
@"[Ff]rom:[^<]*\<([^@][email protected][^>]+)>[Tt]o:[^<]*\<([^@][email protected][^>]+)>[Ss]ubject: ?(.*)Thread-Topic"

string source = "...with mapi id 14.02.0387.000; Thu, 6 Feb 2014 09:09:33 +0100From: site <[email protected]>To: \"[email protected]\" <[email protected]>Subject: can this bounceThread-Topic: can this bounceThread-Index: Ac8jEr8t3k2RouQ1RaGPCXGFcE5oNg==Date:..."; 
Regex pattern = new Regex("[Ff]rom:[^<]*\\<([^@][email protected][^>]+)>[Tt]o:[^<]*\\<([^@][email protected][^>]+)>[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); 

我检查,如果内部邮件符号(存在@)在我的表达和提取物所有部分都是单一模式。
如果你想找到只有电子邮件地址,你可以使用这个表达式:

@"\<[^>@][email protected][^>]+>" 
+0

我刚试过你的解决方案,但由于某种原因,mc.Count永远不会> 0 .. :( –

+0

我测试我的解决方案,我得到这个结果:'From:[email protected]到:[email protected]主题:这可以反弹吗?所以你不可能得到不同的结果。我相信你使用了不同的输入。你能发送你测试过的字符串“source”的全部内容吗? ..或更新你的问题,并写下你已经测试过的东西。 – Atiris

+0

嗨Atiris,是的,我使用不同的输入字符串。没有张贴在这里,因为它相当长。是否有可能在这里使用一些邮件系统发送它,或者你想怎么做? –

0

我用你的源文本试过这使用RegexBuddy与.NET的味道,它打破它变成一个名为捕获组,这样就可以使用match.Groups [“FROM”]。值等

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

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

+0

与Atiris的答案一起使用:) – Tom

相关问题