2013-04-10 108 views
0

我一直在努力在这一段时间,你可以请给一些提示...正则表达式/正则表达式“或”

在Outlook电子邮件,我们可以转发的电子邮件的信息在电子邮件正文为:

From: Jackson, Peter 
Sent: Tuesday, 26 March 2013 08:25 PM 
To: **Match, Me**; GGG 
Cc: AAA, BBB; CCC, DDD; EEE, FFF 
Subject: FW: Good Morning 

From: Jackson, Peter 
Sent: Tuesday, 26 March 2013 08:25 PM 
To: AAA; GGG 
Cc: BBB; **Match, Me**; DDD; EEE, FFF 
Subject: FW: Good Morning 

现在我想获得的日期时间在“已发送”如果有一个“比赛,我”的是“要”还是“抄送”名单。

正则表达式现在我已经是:

(<b>)?Sent:(</b>)?\s(?<MatchDateTime>[A-Z][a-z]{5,8},\s[0-9]{1,2}\s[A-Z][a-z]{2,9}\s[0-9]{4}\s[0-9{1,2}:[0-9][0-9]\s[A-Z]{2})(<br\s?/?>)?(\\r\\n)*?(<b>)?To:(</b>)?\s.[^<]*?(Match, Me).*?(<br\s?/?>)?(\\r\\n)*?(<b>)?Cc:(</b>)?\s.[^<]*?(Match, Me).*?(<br\s?/?>)(\\r\\n)* 

下面是一些示例文本:

<span lang=\"EN-US\" style=\"font-size:10.0pt;font-family:"Tahoma","sans-serif"\"> BBB, AAA [mailto:[email protected]]\r\n<br>\r\n<b>Sent:</b> Tuesday, 26 March 2013 5:23 PM<br>\r\n<b>To:</b> **Match, Me**; DDD; EEE<br>\r\n<b>Cc:</b> EEE, ZZZ; GGG, FFF<br>\r\n<b>Subject:</b> RE: Good Morning<o:p></o:p></span> 

<span lang=\"EN-US\" style=\"font-size:10.0pt;font-family:"Tahoma","sans-serif"\"> BBB, AAA [mailto:[email protected]]\r\n<br>\r\n<b>Sent:</b> Tuesday, 26 March 2013 5:23 PM<br>\r\n<b>To:</b> UUU, AAA, DDD; EEE<br>\r\n<b>Cc:</b> Match, Me; ZZZ; GGG, FFF<br>\r\n<b>Subject:</b> RE: Good Morning<o:p></o:p></span> 

我正则表达式只能匹配一个状态(到列表或抄送清单),但不是两个,你可以请帮忙,谢谢!

+2

不要使用RegEx解析HTML/XML。改为使用XML/HTML解析器。如[LINQ to XML](http://msdn.microsoft.com/en-us/library/bb387098.aspx)或[HTML Agility Pack](http://htmlagilitypack.codeplex.com/)。 – abatishchev 2013-04-10 00:55:49

+0

一般而言,您正在寻找管道字符http://jsfiddle.net/b9chris/8xMAm/ - 因为您可能知道JS和C#都使用相同的正则表达式标准,所以正则表达式字符串在两者之间是兼容的。但以这种方式使用单个正则表达式似乎太复杂了 - 将其分解成几个更简单的部分,您可能得到的几个额外的性能不值得这个代码对于下一个编码器来说是多么的不可能修改。 – 2013-04-10 01:03:37

+0

嗨,谢谢你的回复。由于这是现有工作的一项新功能,不幸的是我必须坚持使用C#中的Regex.Matches,对我而言,唯一的选择可能就是正则表达式。 – Xin 2013-04-10 01:05:50

回答

0

这是我想出了:

(\<b\>)?Sent:(\</b\>)?\s(?<MatchDateTime>[A-Z][a-z]{5,8},\s[0-9]{1,2}\s[A-Z][a-z]{2,9}\s[0-9]{4}\s[0-9]{1,2}:[0-9][0-9]\s[A-Z]{2}).*?(To|Cc):(\</b\>)?\s[^<]*?(Match, Me) 

首先,我认为这是更好地逃避所有<>字符,因为它们在正则表达式语法很多使用。在日期匹配组之后,我添加了一个非贪婪的.*?来读取输入,直到满足第一个ToCc。然后它读取,直到它匹配Match, Me

+0

感谢您的回复。您发布是非常接近的答案,但是,试图在此之后,我发现了一个错误: 如果我们有 发送:星期二,2013 3月26日下午5时23
\ r \ n 要: DDD ; EEE
\ r \ n 抄送: EEE,ZZZ; GGG,FFF
\ r \ n 主题: RE:早安 **一些TEXT这里**比赛,我 正则表达式可以匹配整个文本,但是,本场比赛,我是不是在任到或Cc列表。 – Xin 2013-04-10 04:35:31

+0

不确定我是否已经清楚解释:在除此信息块之外的其他地方的电子邮件中,我们也可以匹配“Match,Me”(即在某人的签名中)。正则表达式匹配从“已发送”开始,然后通过任何文本,然后在“Match,Me”处停止。我们只能在该电子邮件的信息块中进行匹配吗? – Xin 2013-04-10 04:43:22

+0

@Xin我试过你提供的例子,它不匹配。 – 2013-04-10 10:35:28