首页 > 邮件开发 中的邮箱地址提取!

邮件开发 中的邮箱地址提取!

如何在 几万行或者 几十万行的的 文件中 准确的获取到 邮箱地址 并把这些地址 输出!


基本原理就是文本匹配,这个用正则表达式就好了:

[\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?

如果数据量比较大,从效率方面考虑应使用fork/join去处理


注意

读取几十万行记得逐行读取,然后将返回的emailList拼接起来,不然一次性全部读取几十万行会GG

Code :

    /**
     * 域名后缀维护列表,为保证匹配准确度,仅匹配域名列表里有的邮箱
     * 例如  sf@sf.ggadmin@,help@admin.sf.gg 都可以被正确匹配
     * sf@sf.gggame@google.com 也可以正确拆分为 sf@sf.gg 和 game@google.com
     * 以下域名列表请自行按需添加, | 是间隔符
     *
     * @param str 传入的含有邮箱的字符串
     * @return emailList 已提取的邮箱列表
     * @author Levey
     * @time 16/1/20 14:35
     */

    private static List getEmailList(String str) {
        //在此维护域名后缀表
        String dn = "com|cn|org|com.cn|xyz|net|gg|gov.cn|love";
        Pattern p = Pattern.compile("[\\w[.-]]+@[\\w[.-]]+\\.(" + dn + ")"); //邮箱验证
        Matcher m = p.matcher(str);
        List<String> emailList = new ArrayList<>();
        while (m.find()) {
            //update  2016-1-21 10:03:45
            //去除包涵连续两个点的邮箱
            if(!m.group().contains("..")) {
                emailList.add(m.group());
            }
        }
        return emailList;
    }

Test:

public static void main(String args[]) {
        String str = "tencent.sf.gg@10000@qq.comghghghghg\n" +
                "你好leveychen,lev;levey-chen@myema你aaa@this.gov.cn好il.gmail.com悲" +
                "剧help@admin.sf.gg了" +
                "啊m@levey.com.cnmnihao的都是</br>和<sf@sf.gggame@google.com>";
        System.out.println(getEmailList(str));
    }

Output:

10000@qq.com
aaa@this.gov.cn
help@admin.sf.gg
m@levey.com.cn
sf@sf.gg
game@google.com

update 2016/01/20 15:09:41
更新已知bug
极端情况下
com 和 co 域名无法正确识别,例如 my@email.comy@email.com
这会优先提取 com域名,然后再去匹配co 域名
abc@mail....com 也能被匹配


//update 2016-1-21 10:03:45
//去除包涵连续两个点的邮箱


百度 正则表达式

【热门文章】
【热门文章】