0

因此,我正在从 Eudora 解析一个 .mozeml 文件并将它们转换为 mbox 文件(mbox 已损坏并被删除,但 mozeml 文件仍然存在,但无法导入它们)。有超过 200,000 封电子邮件,并且不确定什么是正确处理此问题的好方法。

我正在考虑创建一个 Java 程序,它将读取 .mozeml 文件(它们是 xml,utf-8 格式)解析数据,然后以这种格式编写一个 mbox 文件http://en.wikipedia.org/wiki/ 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

4 回答 4

1

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

于 2012-08-09T19:04:48.810 回答
0

Here's a standard email regex modified for your format:

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

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

It's not going to work if, as in your first example, the email runs directly into the message (joe2@gmail.comHello this), and it assumes your email addresses always begin with ;. You can put other delimiters in there, though.

于 2012-08-09T19:41:08.387 回答
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

于 2012-08-09T19:14:49.777 回答
0

如果您知道所有域后缀是什么,您可以使用一些 regex-fu 来做到这一点:

[a-zA-Z_\.0-9]+@[a-zA-Z_\.0-9]+\.(com|edu|org|net|us|tv|...)

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

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

[a-zA-Z_\.0-9\-]+@[a-zA-Z_\.0-9\-]+\.(.aero|.asia|.biz|.cat|.com|. coop|.info|.int|.jobs|.mobi|.museum|.name|.net|.org|.pro|.tel|.travel|.xxx|.edu|.gov|.mil|.ac| .ad|.ae|.af|.ag|.ai|.al|.am|.an|.ao|.aq|.ar|.as|.at|.au|.aw|.ax|.az |.ba|.bb|.bd|.be|.bf|.bg|.bh|.bi|.bj|.bm|.bn|.bo|.br|.bs|.bt|.bv|。 bw|.by|.bz|.ca|.cc|.cd|.cf|.cg|.ch|.ci|.ck|.cl|.cm|.cn|.co|.cr|.cs| .cu|.cv|.cx|.cy|.cz|.dd|.de|.dj|.dk|.dm|.do|.dz|.ec|.ee|.eg|.eh|.er |.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|.in|.io|.iq|.ir|.is|.it|.je|.jm|.jo|.jp|.ke|.kg |.kh|.ki|.km|.kn|.kp|.kr|.kw|.ky|.kz|.la|.lb|.lc|.li|.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|.my|.mz|.na|.nc|.ne|.nf|.ng|.ni|.nl|.no |.np|.nr|.nu|.nz|.om|.pa|.pe|。pf|.pg|.ph|.pk|.pl|.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|.so|.sr|.ss |.st|.su|.sv|.sy|.sz|.tc|.td|.tf|.tg|.th|.tj|.tk|.tl|.tm|.tn|.to|。 tp|.tr|.tt|.tv|.tw|.tz|.ua|.ug|.uk|.us|.uy|.uz|.va|.vc|.ve|.vg|.vi| .vn|.vu|.wf|.ws|.ye|.yt|.yu|.za|.zm|.zw)

当然,我不确定这是否是 TLD 的完整列表,而且我知道 ICANN 最近开始允许自定义 TLD,但这应该会涵盖绝大多数电子邮件地址。

于 2012-08-09T19:17:20.390 回答