2012-08-09 28 views
0

所以,我解析從Eudora一個.mozeml文件,並將它們轉換爲MBOX文件(MBOX被損壞,並刪除,但mozeml文件被遺留下來,但無法將其導入)。有超過20萬封電子郵件,並不確定正確處理這個問題的好方法。拉電子郵件從一個字符串

我想創建一個Java程序,它將讀取.mozeml文件(它們是xml,utf-8格式)解析數據,然後用這種格式編寫一個mbox文件http://en.wikipedia.org/wiki/Mbox#Family

的問題僅僅是XML文件並沒有分開爲線,並且該消息;它只是一個完整的字符串。我不完全確定如何妥善處理。

例如這裏是消息的外觀

"Joe 1" <[email protected]>[email protected] this is an e-mail... 

"Joe 1" <[email protected]>"Joe 2" <[email protected]>Hello this is an e-mail... 

有很多的測試用例來檢查它是否是一個.COM/.NET/com.hk/.CO .JP /等。爲第一個。第二個是有點更容易,因爲的,以線到底是>。所以,我不確定第一個案件,並確保它對於200,000封電子郵件將是準確的。

回答

1

嘗試解析字符串ANTLR庫。

0

對於這一問題,首先想到的是用正則表達式和掃描儀找到下一個週期電子郵件occurence。

class EmailScanner { 
    public static void main(String[] args) { 
     try { 
      Scanner s = new Scanner(new File(/* Your file name here. */);); 
      String token; 
      do { 
       token = s.findInLine(/* Put your email pattern here. */); 
       /* Write your token where you need it. */ 
      } while (token != null); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

可能很容易找到可能的電子郵件模式。例如^[a-zA-Z0-9._%+-][email protected][a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$^[a-zA-Z0-9._%+-][email protected][a-zA-Z0-9.-]+\.(?:[a-zA-Z]{2}|com|org|net|edu|gov|mil|biz|info|mobi|name|aero|asia|jobs|museum)$看到http://www.regular-expressions.info/email.html

0

如果你知道所有的域名後綴,你可以與一些正則表達式福做到這一點:

[A-ZA-Z _ \ 0-9] + @ [A-ZA-Z_ \。 0-9] + \(COM | EDU |組織|網絡|簡介|電視| ...)

你可以找到的頂級域名在這裏的列表:http://en.wikipedia.org/wiki/List_of_Internet_top-level_domains

的完整的regex,我相信,應該是這樣的:

[a-zA-Z _ \。0-9 \ - ] + @ [a-zA-Z _ \。0-9 \ - ] + \。(。aero | .asia | .BIZ |的.cat | .COM | .coop | .INFO | .INT | .JOBS | .mobi域名| .museum |。名稱| .NET | .ORG |的.pro |。電話|。旅行| .XXX |埃杜| .GOV |。密爾| .AC | PH_1PH_1廣告| .AE | .af | .AG | .AI | .al | .AM | .an | .ao | .aq | .ar |。至於| .AT | .AU | .aw | .ax | .az | .ba |的.bb | .bd | .BE | .bf | .bg | .bh | .BI | .bj | .bm作| .bn | .bo | .BR | .BS |。BT | .bv | .bw |。通過| .BZ | .CA | .CC | .CD |的.cf | .cg |·CH | .CI |。 CK | .CL | .CM | .CN | .CO | .CR |的.cs | .CU | .CV | .CX | .cy | .CZ | .DD |由Matchi.com提供回到| .dj |沒有自動跳轉| .dm | 。做| .dz | .ec | .ee | .eg | .eh |呃| .ES | .ET |註冊.eu | .fi | .fj | .fk | .FM | .fo | .FR | .ga | .gb | .gd | .GE | .gf | .gg | .gh | .GI | .gl | .gm | .gn | .gp | .gq | .gr | .GS | .GT | .gu |。 GW | .gy | .HK | .hm | .HN | .HR | .HT | .HU | .ID | .IE | .il內| .IM |。在| .IO | .iq | .IR |。就是| 。它| .je | .jm | .jo | .JP | .ke | .kg | .kh | .KI | .km | .kn | .KP | .kr | .kw | .ky | .kz | .la | .lb |。LC |。李| .lk | .lr | .ls | .LT | .lu | .lv | .ly | .MA |的.mc | .MD | .ME | .mg | .mh |。 MK | .ml | .mm | .MN |的.mo | .MP | .mq | .mr | .MS | .mt | .MU | .mv | .mw | .MX |。我| .mz | .na | .NC | .NE | .nf | .ng | .ni | .NL |。沒有| .np | .nr | .NU | .NZ | .om | .PA | .PE | .PF | .pg | .PH |的.pk |特等| .pm的| .pn | .pr | .PS | .PT | .pw |的.py | .qa | .RE | .RO | .RS | .RU | .rw | .SA |。 SB | .SC | .sd | .SE | .SG | .SH | .si | .sj | .sk | .sl | .SM | .sn |。所以|輸出功率等| .SS | .ST |。蘇| .sv | .SY | .sz | .TC | .td | .tf | .tg | .TH | .tj | .TK | .TL | .tm | .tn |。要| .TP | .tr | .TT | .TV | .TW | .tz | .ua | .ug | .UK |頁面沒有自動跳轉| .uy | .uz | .va | .vc | .VE | .vg | .vi的| .vn | .vu | .wf | .ws | .ye | .yt | .yu | .za | .zm | .zw)

當然,我不確定這是否是TLD的完整列表,而且我知道ICANN最近開始允許自定義TLD,但這應該會吸引絕大多數電子郵件地址。

+0

有一個關於電子郵件驗證後(當然也可以用於searchign以及)http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-地址,但符合標準的正則表達式看起來更難:http://ex-parrot.com/~pdw/Mail-RFC822-Address.html。 – Vic 2012-08-09 19:23:03

+0

血腥的地獄,這是瘋狂的複雜。不過,我認爲我的正則表達式應該適用於絕大多數電子郵件地址,假設我沒有錯過任何合法字符。 – rmehlinger 2012-08-10 00:31:21

+0

是的,這真的很瘋狂。它使用相當不尋常的正則表達式語法。另一方面,它非常大,我的感覺是,它會很慢。試試我們建議的東西可能會更有用。 – Vic 2012-08-10 05:38:32

0

這裏的修改您的格式標準的電子郵件正則表達式:

Pattern pattern = Pattern.compile(";[A-Za-z0-9._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"); 
String text = "\"Joe 1\" <[email protected]>[email protected] Hello this is an e-mail..."; 
Matcher matcher = pattern.matcher(text); 

while (matcher.find()) { 
    System.out.println(matcher.group().replaceFirst(";", "")); 
} 

它不會如果工作中你的第一個例子中,電子郵件直接運行到消息([email protected] this),並假定您的電子郵件地址始終以;開頭。不過,您可以在其中添加其他分隔符。

相關問題