法治建设网站作用,单位网站建设的请示,维护网站多少钱,国家pccm建设申报网站需求系统中有一列会用来存储 email 地址#xff0c;现在需要对输入的字符串进行过滤#xff0c;要求是#xff0c;把无效的地址过滤掉。有一些需要说明的是这些地址是通过图像识别得到的#xff0c;有些是用户自己输入的已有历史记录已经存在了脏数据#xff0c;需要替换这…需求系统中有一列会用来存储 email 地址现在需要对输入的字符串进行过滤要求是把无效的地址过滤掉。有一些需要说明的是这些地址是通过图像识别得到的有些是用户自己输入的已有历史记录已经存在了脏数据需要替换这个地址是识别出来的不是用户帐号和联系信息这样的关键数据。所以宁愿相信用户是手误多录入的字符或是机器识别把不该记录的字符当成 Email 的一部分了测试字符串String[] arrEmailAddr new String[]{\uD83D\uDC02abc123cc.cc,A78B[咔嚓]C⌚️2345cc.cc,abc\uD83C\uDF32sdfsdsdfsd.·」cc,a·「d(*^cc.cc,aslfgjk^*\234sgd_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:zhixxxxxxxxxx163.com || 115764 | 邮箱:1xxxxxx890qq.com || 513557 | M0:svxxxxxxvip.163.c0m || 708165 | 邮箱:lixxxxxxxxzjlcwg.com || 966373 | Mail:chenxxxxxxch-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.-_]; // 这个就坑大了自己看结果/** -----abc123cc.ccA78B[]C2345cc.ccabcsdfsdsdfsd.ccad^cc.ccaslfgjk^234sgd_slgkjsdfsd.com---- */// 问题在于“.” 这个字符在里面会被认为是任意字符的匹配对反斜线“免疫”最终结果测试字符见文首正则源码正如上文说的“.” 字符必须放末位// 与下面的等价 String regEx[^0-9a-z-_.];String regEx[^\\w-.];输出abc123cc.cc782345cc.ccabcsdfsdsdfsd.ccadcc.ccaslfgjk234sgd_slgkj-sdfsd.com