扫码关注官方订阅号
如何在 几万行或者 几十万行的的 文件中 准确的获取到 邮箱地址 并把这些地址 输出!
业精于勤,荒于嬉;行成于思,毁于随。
读取几十万行记得逐行读取,然后将返回的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 也能被匹配
my@email.comy@email.com
abc@mail....com
//update 2016-1-21 10:03:45//去除包涵连续两个点的邮箱
百度 正则表达式
基本原理就是文本匹配,这个用正则表达式就好了:
[\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?
如果数据量比较大,从效率方面考虑应使用fork/join去处理
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
注意
读取几十万行记得逐行读取,然后将返回的emailList拼接起来,不然一次性全部读取几十万行会GG
Code :
Test:
Output:
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
//去除包涵连续两个点的邮箱
百度 正则表达式
基本原理就是文本匹配,这个用正则表达式就好了:
如果数据量比较大,从效率方面考虑应使用fork/join去处理