需求

系统中有一列会用来存储 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 地址相关推荐

  1. java检测邮箱是否存在_java如何验证一个email地址是否真实有效。

    展开全部 首先使用java提供的格式类判断email是否格式有62616964757a686964616fe78988e69d8331333337613132误,然后使用开源框架,验证邮箱是否有用,示 ...

  2. win10无法修改mac地址_教一招如何修改MAC地址,小白也能成为网络大神

    ▼更多精彩推荐,请关注我们哦▼ 艾橙课堂 电脑/苹果/安卓实用技巧 好玩/黑科技应用分享 网络技术|电脑技术 技术教程|资源分享 立即加星标 每天看好文 Hello,各位小伙伴们 大家好,我是分享干货 ...

  3. 服务器下修改mac地址是什么,服务器系统修改mac地址吗

    服务器系统修改mac地址吗 内容精选 换一换 通过华为云创建的ECS服务器默认使用华为云提供的内网DNS进行解析.内网DNS不影响ECS服务器对公网域名的访问.同时,还可以不经Internet,直接通 ...

  4. java正则判断日期格式_Java中用正则表达式判断日期格式是否正确

    1.Java中用正则表达式判断日期格式是否正确 DateType.java: /** * @Title:DateType.java * @Package:com.you.dao * @Descript ...

  5. 正则表达式符号特殊详解_常用正则表达式_Java中正则表达式的使用

    正则表达式符号详解 限定符: 指定一个组件必须出现多少次才能满足. 1.使用 "*", "+", "?" 作为限定符: "*&qu ...

  6. 正则表达式的用法及手机号码Email地址是否合法身份证号码是否合法邮政编码

    正则表达式 (1)正则表达式概念: ​ 正则表达式(regular expression)描述了一种字符串 -regex ​ 匹配的模式,可以用来:校验 (a)检查一个串中是否含有符合某个规则的子串, ...

  7. 反编译后怎么修改服务器地址,反编译后怎么修改服务器地址

    反编译后怎么修改服务器地址 内容精选 换一换 业务接入DDoS高防后,经过高防转发的流量到服务端之后真实源IP将被隐藏,在业务应用开发中,通常需要获取客户端真实的IP地址.例如,投票系统为了防止刷票, ...

  8. 久其修改服务器地址什么意思,久其修改服务器地址什么意思

    久其修改服务器地址什么意思 内容精选 换一换 请求URI由如下部分组成.{URI-scheme}://{Endpoint}/{resource-path}?{query-string}例如您需要获取华 ...

  9. linux设置mac地址命令,[转载]Linux下修改MAC地址

    转自http://blogold.chinaunix.net/u3/94284/showart_2430693.html Linux下修改MAC地址 方法一: 1.关闭网卡设备 ifconfig et ...

最新文章

  1. Android移动开发者必须知道的Deep Linking技术
  2. 用C语言编写贪吃蛇项目描述,刚学C语言,想写一个贪吃蛇的代码
  3. .NET Core 2.1预览版首次引入Global Tools
  4. 解决CentOS 中部署JasperReport时出错的问题。错误:net.sf.jasperreports.engine.util.JRFontNotFoundException: Font '宋体
  5. C语言排序方法-----选择排序法
  6. SPRING IN ACTION 第4版笔记-第四章ASPECT-ORIENTED SPRING-008-带参数的ADVICE
  7. 从源码看spring applicationContext在web容器中加载过程
  8. GSL数学库解多参数方程
  9. Java 通过银行卡号获取银行名称
  10. 股市投资必修课十九---DCF三要素经营存续期、现金创造力、经营周期定位
  11. 数据分析实战——二手房信息分布分析
  12. 搜索引擎技术优化原理及方法
  13. 【软考软件评测师】2010年下综合知识历年真题
  14. windows10 安装 choco
  15. 类和对象的基础2——对象的生与死(构造函数和析构函数)
  16. Joel Spolsky在耶鲁大学的演讲(下)
  17. 2016 GDMS全球数字营销峰会在沪胜利召开
  18. java学习个人总结_Java学习的总结
  19. ffmpeg--学习笔记1-下载安装
  20. LPDDR4硬件详解

热门文章

  1. java知识体系 servlet_03-Servlet 体系结构知识梳理
  2. mapper同时添加数据只能添加一条_springcloud项目搭建第二节:eureka+数据库
  3. php页面怎么去登录,php中登录后跳转回原来要访问的页面实例
  4. php invalid access,PHP出错消息PHP has encountered an Access Violation at XXXXXXXX 如何解决?...
  5. 数据库查找姓李的人_最通俗易懂的理解什么是数据库
  6. 垂直串联六关节机器人调试手册_不止下棋能赢你!新型协作机器人样样精通
  7. FTP服务器和客户端源代码编写问题(ftp server client source)
  8. mysql 逗号金额比较,如何使用MySQL比较两个逗号分隔的字符串列表
  9. mysql5.7.18压缩包下载_Windows安装MySQL5.7教程
  10. cesium 隐藏entity_cesium entity创建各类实体