2009-08-04 26 views
1

我有一個我試圖解析以下文本電子郵件地址和用戶名:我怎麼能組多使用正則表達式

 
"[email protected]" <[email protected]>, "Jane Doe" <[email protected] addyB.org>, 
"[email protected]" <[email protected]> 

我使用下面的代碼,試圖分裂的字符串:

Dim groups As GroupCollection 
Dim matches As MatchCollection 
Dim regexp1 As New Regex("""(.*)"" <(.*)>") 
matches = regexp1 .Matches(toNode.InnerText) 
For Each match As Match In matches 
    groups = match.Groups 
    message.CompanyName = groups(1).Value 
    message.CompanyEmail = groups(2).Value 
Next 

但這正則表達式是貪婪和之後「[email protected]」被抓住了整個字符串到最後的報價。我很難拼湊一個表達式,將該字符串分組到我要查找的兩個組中:名稱(在引號中)和電子郵件(在尖括號中)。有人有任何意見或建議,以改變正則表達式來獲得我所需要的?

回答

2

相反,我會做到這一點:

string[] addresses = toNode.InnerText.Split(","); 
foreach(string textAddress in addresses) 
{ 
    textAddress = address.Trim(); 
    MailAddress address = new MailAddress(textAddress); 
    message.CompanyName = address.DisplayName; 
    message.CompanyEmail = address.Address; 
} 

雖然正則表達式可以爲你顯示了一些測試情況下工作。從長遠來看,使用MailAddress類可能會更可靠。

1

"""([^""]*)"" <([^>]*)>"對於正則表達式呢?即明確表示匹配的部分不會包含引用/關閉paren。您可能還想使用更具限制性的字符範圍。

+0

第一部分應該是``「([^」「] *)」「`,而不是`」「([^)] *)」「``。 – 2009-08-04 15:48:32

+0

當然可以。我把所有的標點符號都弄糊塗了;-) – sepp2k 2009-08-04 16:21:25

0

您需要指定您想要的最小匹配表達式。 您也可以用更精確的替換(。*)模式: 例如,您可以排除逗號和空格... 通常最好避免在正則表達式中使用。*,因爲它會降低性能!例如,對於電子郵件,您可以使用[\ w - ] + @([\ w - ] +。)+ [\ w - ] +或更復雜的模式。
你可以找到一些好的模式:ASP.net運行http://regexlib.com/

0

不知道什麼正則表達式引擎,但加入了嘗試非貪婪的變種?在正則表達式中。

例的正則表達式比滾動自己的正則表達式

""(.*?)"" <(.*?)> 
相關問題