从字符串中拉出电子邮件

时间:2012-08-09 18:41:39

标签: java xml string parsing email

所以,我正在从Eudora解析一个.mozeml文件并将它们转换成一个mbox文件(mbox被破坏,删除但是mozeml文件被遗留,但无法导入它们)。有超过200,000封电子邮件,并且不确定什么是正确处理这种情况的好方法。

我正在考虑创建一个Java程序来读取.mozeml文件(它们是xml,utf-8格式)解析数据,然后以这种格式http://en.wikipedia.org/wiki/Mbox#Family编写一个mbox文件。

问题在于xml文件没有将To行和消息分开;它只是一整个字符串。我不完全确定如何妥善处理。

例如,这里是消息的外观

    "Joe 1" <joe1@gmail.com>joe2@gmail.comHello this is an e-mail...

    "Joe 1" <joe1@gmail.com>"Joe 2" <joe2@gmail.com>Hello this is an e-mail...

有很多测试用例要检查它是否是.com / .net / com.hk / .co.jp / etc。对于第一个。第二个更容易,因为to行的结尾是>。所以,我不确定第一个案例,并确保它对于200,000封电子邮件来说是准确的。

4 个答案:

答案 0 :(得分:1)

尝试使用antlr库来解析字符串。

答案 1 :(得分:0)

这个问题的第一个想法是使用正则表达式和扫描程序来查找循环中的下一个电子邮件发生。

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._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$^[a-zA-Z0-9._%+-]+@[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

答案 2 :(得分:0)

如果您知道所有域后缀是什么,可以使用一些正则表达式来执行此操作:

[A-ZA-Z _ \ 0-9。] + @ [A-ZA-Z _ \ 0-9。] + \。(COM | EDU |有机|净|我们| TV | ...)< / p>

您可以在此处找到顶级域名列表:http://en.wikipedia.org/wiki/List_of_Internet_top-level_domains

我相信完整的正则表达式应该是这样的:

[A-ZA-Z _ \ 0-9 \ - ] + @ [A-ZA-Z _ \ 0-9 \ - ] + \(航空| .ASIA | .BIZ |的.cat |。 COM | .coop | .INFO | .INT | .JOBS | .mobi域名| .museum |。名称| .NET | .ORG |的.pro | .tel域名|。旅行| .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,但这应该可以捕获绝大多数电子邮件地址。

答案 3 :(得分:0)

这是针对您的格式修改的标准电子邮件正则表达式:

Pattern pattern = Pattern.compile(";[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}");
String text = "\"Joe 1\" &lt;joe1@gmail.com&gt;joe2@gmail.com Hello this is an e-mail...";
Matcher matcher = pattern.matcher(text);

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

如果在第一个示例中,电子邮件直接在邮件(joe2@gmail.comHello this)中运行,并且假设您的电子邮件地址始终以;开头,那么它就无法运行。不过,你可以把其他分隔符放在那里。