注意
读取几十万行记得逐行读取,然后将返回的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 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的都是和";
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
//去除包涵连续两个点的邮箱