java邮箱地址正则表达式_Java 中用正则表达式修改 Email 地址
需求
系統中有一列會用來存儲 email 地址,現在需要對輸入的字符串進行過濾,
要求是,把無效的地址過濾掉。有一些需要說明的是
這些地址是通過圖像識別得到的,有些是用戶自己輸入的
已有歷史記錄已經存在了臟數據,需要替換
這個地址是識別出來的,不是用戶帳號和聯系信息這樣的關鍵數據。所以寧愿相信用戶是手誤多錄入的字符,或是機器識別把不該記錄的字符當成 Email 的一部分了
測試字符串:
String[] arrEmailAddr = new String[]{
"\uD83D\uDC02abc123@cc.cc",
"A78=B[咔嚓]C??2345@cc.cc",
"abc\uD83C\uDF32'sdfsd@sdfsd.·」cc",
"a·「d(*^@cc.cc",
"asl'''fgjk&^*'\"234@sgd_slgkj-sdfsd.com"
};
方案和坑
本以為用了很多年正則,已經很熟練了,應該信手拈來,沒想到實際操作時居然遇到那么多坑
首先可以確定的是,使用 Java 的 ReplaceAll 是沒錯了
網上廣為流傳的神 Pattern
// 清除掉所有特殊字符
String regEx="[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?]";
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(str);
return m.replaceAll("").trim();
首先,我是十分討厭這種窮舉法的;其次,對層出不窮的特殊字符控制不足,比如全角空格、顏文字等等。
pass
按照 Email 的格式嚴格匹配,把不符合 Email 格式的直接替換掉
是個比較徹底的方法,但是,實際操作前,發現有這樣一些讓人無語的臟數據:
+--------+----------------------------------------------------+
| id | email |
+--------+----------------------------------------------------+
| 66898 | 信箱三-mail:zhixxxxxxxxxx@163.com |
| 115764 | 郵箱:1xxxxxx890@qq.com |
| 513557 | M0:svxxxxxx@vip.163.c0m |
| 708165 | 郵箱:lixxxxxxxx@zjlcwg.com |
| 966373 | Mail:chenxxxxxx@ch-jht.com |
+--------+----------------------------------------------------+
5 rows in set (0.05 sec)
這些記錄不在少數,肯定需要保留。
所以,問題還是回到 替換 這條思路上來
使用白名單
實際上只能這么做,難點和坑也在于這里,先列幾個我犯的錯誤示例:
String regEx = "/[0-9a-z]/"; // 這是一個正向測試,不過測試本身就有問題,Java里面不是用 “/” 來標識兩端的
String regEx="[^0-9][^a-z][^_]"; // 這樣會順序匹配,在每個匹配組上干掉了其他組的合法字符
String regEx="(\\W|@|-....)"; // 匹配到第一個之后,就直接過濾掉了,后面的其他字符不會被保留
String regEx="^[a-z0-9-_@]"; // ^ 字符匹配的是字符串開始的地方,無法作為 “非” 來使用,加轉譯就更不對了
String regEx="[^0-9a-z.-_@]"; // 這個就坑大了,自己看結果:
/** -----
abc123@cc.cc
A78=B[]C2345@cc.cc
abcsdfsd@sdfsd.cc
ad^@cc.cc
aslfgjk^234@sgd_slgkjsdfsd.com
---- */
// 問題在于,“.” 這個字符,在里面會被認為是任意字符的匹配,對反斜線“免疫”
最終結果
測試字符
見文首
正則源碼
正如上文說的,“.” 字符必須放末位
// 與下面的等價 String regEx="[^0-9a-z-_@.]";
String regEx="[^\\w-@.]";
輸出
abc123@cc.cc
782345@cc.cc
abcsdfsd@sdfsd.cc
ad@cc.cc
aslfgjk234@sgd_slgkj-sdfsd.com
總結
以上是生活随笔為你收集整理的java邮箱地址正则表达式_Java 中用正则表达式修改 Email 地址的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 4款2000元以下适合上网课的笔记本!1
- 下一篇: java猜数游戏图形界面_Java做一个