0

そこで、Eudora から .mozeml ファイルを解析し、それらを mbox ファイルに変換しています (mbox は破損して削除されましたが、mozeml ファイルは残っていましたが、インポートできませんでした)。200,000 通を超える電子メールがあり、これを適切に処理するための適切な方法がわからない.

.mozeml ファイル (xml、utf-8 形式) を読み取り、データを解析してから、この形式で mbox ファイルを書き込む Java プログラムを作成することを考えていますhttp://en.wikipedia.org/wiki/ Mbox#ファミリー.

問題は、xml ファイルが To 行とメッセージを分離していないことです。1 つの文字列全体です。それを適切に処理する方法が完全にはわかりません。

たとえば、メッセージは次のようになります

    "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 かどうかを確認するテストケースはたくさんあります。最初のもののために。2 つ目は、to 行の終わりが > であるため、少し簡単です。したがって、最初のケースについては確信が持てず、200,000 通のメールに対して正確であるかどうかはわかりません。

4

4 に答える 4

1

文字列を解析するためにantlrライブラリを試してください。

于 2012-08-09T19:04:48.810 に答える
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}$またはhttp://www.regular-expressions.info/email.html^[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)$を参照してください。

于 2012-08-09T19:14:49.777 に答える
0

すべてのドメインサフィックスが何であるかを知っている場合は、いくつかの正規表現でこれを行うことができます:

[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 に答える
0

これは、フォーマット用に変更された標準の電子メール正規表現です。

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(";", ""));
}

最初の例のように、電子メールがメッセージ ( ) に直接実行され、joe2@gmail.comHello this電子メール アドレスが常に で始まると想定されている場合は機能しません;。ただし、そこに他の区切り文字を入れることはできます。

于 2012-08-09T19:41:08.387 に答える