2013-04-10 110 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