
本文介绍一种安全、可复用的正则表达式方法,用于在 json 字符串中定位并掩码邮箱字段的局部字符(如 t***.***%**@gmail.com),避免误匹配 html 标签或 json 结构,解决传统宽泛正则在嵌套内容中失效的问题。
在处理敏感数据(如用户邮箱)时,常需对 JSON 格式的 API 响应或日志进行脱敏。但直接复用纯邮箱字符串的掩码正则(如 (?作用域,会错误匹配引号内任意位置(包括 HTML 属性、data-cfemail 值甚至 JSON 键名),且 Java 中的 (?固定长度,而原正则中的 .{1} 无法与后续动态内容协同定位。
✅ 正确思路是:锚定上下文 + 有限宽度回溯 + 安全边界约束。推荐使用以下优化正则:
String jsonString = "{ \"name\":\"jhon\", \"email\":\"test.ing%[email protected]\" }";
String masked = jsonString.replaceAll("(?<=email\":\"[^\\s\"]{1,100})[a-zA-Z0-9](?=[^\\s\"@]*@)", "*");
System.out.println(masked);
// 输出: { "name":"jhon", "email":"t***.***%**@gmail.com" }? 正则解析:
- (?
- [a-zA-Z0-9]:精确匹配邮箱本地部分(@ 前)中需掩码的单个字母或数字;
- (?=[^\\s\"@]*@):正向后行断言,确保该字符右侧直到 @ 之间不包含空格、双引号或 @ 自身(防止误入 data-cfemail 或 URL)。
⚠️ 注意事项:
- 长度阈值可调:{1,100} 中的 100 应根据实际邮箱最大长度(含 HTML 标签)调整,过小会漏匹配,过大可能越界;
- 仅掩码本地部分:此方案默认不对域名(@gmail.com)做掩码;如需隐藏域名,可额外添加类似规则(如 (?
- JSON 解析优先于正则:生产环境强烈建议优先使用 Jackson/Gson 解析 JSON,定位 email 字段后再对值做掩码(更健壮、防注入),正则仅适用于无法修改解析逻辑的场景(如日志中间件);
- 转义细节:Java 字符串中反斜杠和双引号必须双重转义(\\s、\\\"),切勿遗漏。
总结:该正则通过“上下文锚定 + 字符类限制 + 边界防护”三重机制,在保持轻量级的同时显著提升 JSON 内邮箱掩码的准确率与安全性,是兼顾可维护性与工程落地的实用方案。










