2011-10-26 132 views
2

我一直在試圖從下面的字符串包含通過正則表達式多行Java中的姓名和電子郵件地址,電子郵件地址:提取名稱,並從字符串的正則表達式

From: Kane Smith <[email protected]> 
To: John Smith <[email protected]>, Janes Smith 
    <[email protected]>, Tom Barter <[email protected]>, Other 
    Weird @#[email protected]<>#^Names <[email protected]>, 
    Long Long Long Long Name <[email protected]> 
Date: Tue, 25 Oct 2011 15:45:59 +0000 

我想這正則表達式:To:\s?(([.*]+)\s*<([\w\[email protected]\.]*)>,(\s|\n)*)+ 但它不起作用。

我的意圖是提取每個姓名和電子郵件地址,並將每個姓名的電子郵件地址一起分組。然而,我所做的,似乎只有當有一個單一的名稱和地址時才起作用。我的正則表達式應該怎麼做?

回答

3
String s = "To: John Smith <[email protected]>, Janes Smith\n" 
      + "<[email protected]>, Tom Barter <[email protected]>, Other \n" 
      + "Weird @#[email protected]<>#^Names <[email protected]>, \n" 
      + "Long Long Long Long Name <[email protected]>"; 
    s = s.substring(3); // filter TO: 
    System.out.println(s); 
    // Use DOTALL pattern 
    Pattern p = Pattern.compile("(.*?)<([^>]+)>\\s*,?",Pattern.DOTALL); 

    Matcher m = p.matcher(s); 

    while(m.find()) { 
     // filter newline 
     String name = m.group(1).replaceAll("[\\n\\r]+", ""); 
     String email = m.group(2).replaceAll("[\\n\\r]+", ""); 
     System.out.println(name + " -> " + email); 
    } 
+0

謝謝!但是因爲這實際上來自電子郵件標題,所以我可能無法做一個子字符串,然後再替換掉。我更新了關於搜索字符串的問題,以表明由於To和To之下的內容,還有其他內容。如果To不僅僅是乾淨的,我還可以將它們提取出來嗎? – Carven

+1

爲什麼不使用其他正則表達式來獲取「TO」內容,然後使用此代碼提取電子郵件和名稱? – Fred

+1

@Fred:如果主題或名稱或者如果有另一個標題說'Delivery-To:'會發生什麼,我將獲得不止一個用於搜索「To」的內容。 – Carven

1

您可以分割每行 「」 再使用javax.mail.internet.InternetAddress。這將負責提取名稱和地址。

順便說一句,你從哪裏得到標題,爲什麼他們不能成爲關鍵值,因爲他們應該是?

+0

內容直接來自POP。我不打算使用javamail庫。 – Carven