2011-05-08 61 views
2

我有這個字符串Sample Text <[email protected]>和這個字符串[email protected],我試圖匹配前面的文本(本示例中的「示例文本」),如果它存在和電子郵件沒有「<」 ,「>」字符。那之前和之後可能有空白。起初我使用Regex.Split與這個表達式@"\s*(.*)<(.*@.*)>\s*",但它給了我4個字符串,而不是2.我想要的2個字符串是正確的,但它也返回空字符串。現在我試着用Regex.Matches使用這個表達式@"\s*(.*)(?: <)?(.*@.*)(?:>)?\s*"它找到3個匹配項。 2再次是正確的,另一個是輸入字符串本身。至於第二個字符串,它不起作用。我該如何解決?如何匹配字符串與正則表達式在C#

+1

不會添加一個答案,因爲其他人似乎已基本覆蓋它。但是,如果您決定使用正則表達式而不是「MailAddress」類(例如,如果您需要搜索以查找電子郵件地址),則可以非常鬆散地編寫正則表達式並解析/清理字符串事後(使用'MailAddress'和/或調用'string.Split'和'string.Trim')。試圖使正則表達式搜索/驗證正確的格式以及清理字符串可能會使正則表達式比需要的更復雜。 – 2011-05-08 22:34:28

回答

3

這可以沒有正則表達式。看看MailAddress課程;它可以用來解析字符串一樣在你的榜樣:

var mailAddress = new MailAddress("Sample Text <[email protected]>"); 

這裏mailAddress.Address屬性將包含[email protected]值,mailAddress.DisplayName將包含Sample Text值。

+0

哇..這是令人印象深刻的..這是如何工作? – user579674 2011-05-08 20:08:47

+1

@ user579674:閱讀他鏈接頁面上的「備註」部分。它有一些稍微複雜的實現,但我猜測「Display Name <[email protected]>」是一種半標準格式。 http://msdn.microsoft.com/en-us/library/system.net.mail.mailaddress.aspx – 2011-05-08 22:28:45

1

Regex.Matches總是返回第一個匹配的完整匹配,所以只需忽略它並使用第二個和第三個。

以匹配第二串類型(僅電子郵件)的你更好地使用single email regex

2

根據您的測試用例這個表達式可以工作..

(.*)\s?\<(.*)\> 
匹配第一個類型,如果沒有找到匹配的第二

這會給你的結果1前文& 2包含<>括號內的文字

如果你關心確保電子郵件是有效的,你不妨關注一下在一個更徹底的電子郵件正則表達式,但我猜你正在嘗試匹配來自電子郵件或郵件服務器的字符串,以便可能不成問題。

此外,它的價值抓住正則表達式構建程序,如Expresso或使用衆多在線工具之一來幫助建立您的正則表達式。

+0

好吧,這確實解決了第二個字符串的問題..是不是在一個表達式中做到這一點? – user579674 2011-05-08 19:44:06

+0

不是真的,我給你的解決方案是要求正則表達式爲你匹配兩個組,即()括號中的東西。你怎樣才能將兩部分數據作爲一個項目返回? – Dve 2011-05-08 19:46:28

+0

事實證明,正則表達式不適用於第二個字符串..無論如何,我認爲,如果regex.matches確實返回初始結果,那麼我只會做第二個字符串的另一個 – user579674 2011-05-08 19:51:45

0

試試這個位置

\s*(.*?)(?: <)?(\S*@.*)(?:>)?\s* 

我改變你只有一點點。

  1. 加入到第一組中嗎?使其成爲一個懶惰的匹配

  2. @之前的部分改爲\S,除了空格以外什麼都沒有。

你可以看到它online here on Rubular

相關問題