
本文详解如何用健壮的正则表达式对 JSON 字符串中特定键(如 "Name1"、"pass")的字符串值进行前5字符掩码,避免因原始值长度不足导致引号、逗号等结构符号被意外截断或丢失。
本文详解如何用健壮的正则表达式对 json 字符串中特定键(如 `"name1"`、`"pass"`)的字符串值进行前5字符掩码,避免因原始值长度不足导致引号、逗号等结构符号被意外截断或丢失。
在处理 JSON 字符串的敏感字段(如姓名、密码)时,常需对值的前若干位进行掩码(如替换为 *****),同时严格保持 JSON 结构完整性。原始方案使用 (?
根本原因在于:(.{1,5})(.*?) 中的 .*? 是非贪婪但无边界约束的,它可能跨过结束引号继续匹配,破坏语法结构。
✅ 正确思路是:仅匹配值内部的字符,明确限定其上下文边界。推荐使用带精确边界的正向先行断言(lookbehind),确保只替换值内容本身,绝不触碰 JSON 的结构符号("、,、} 等)。
✅ 推荐正则表达式(JSON 安全版)
String s = "{ \"Name1\":\"Joe\", \"pass\":\"123456789123\" }";
String masked = s.replaceAll(
"(?<p>但更简洁、高效且<strong>真正健壮</strong>的写法是:</p><pre class="brush:php;toolbar:false;">String s = "{ \"Name1\":\"Joe\", \"pass\":\"123456789123\" }";
// 单次正则:匹配位于 "Name1":" 或 "pass":" 后、且在下一个 " 之前的最多5个非引号字符
String result = s.replaceAll(
"(?<p>? <strong>正则解析</strong>:</p>
- (?
- [^\"]{0,4}[^\"]:匹配 1 到 5 个非双引号字符({0,4}[^\"] 等价于 {1,5},但可安全匹配单字符);
- (?=[^\"]*\"):正向先行断言,确保后面还有零个或多个非引号字符,最终以 " 结尾 —— 这保证了我们始终在同一字符串值内操作,绝不会跨出引号边界。
✅ 完整可运行示例
public class JsonMasker {
private static final String MASK_PATTERN =
"(?<h3>⚠️ 注意事项与最佳实践</h3>
- ❌ 不要直接解析/修改 JSON 字符串:生产环境强烈建议使用标准 JSON 库(如 Jackson、Gson)解析为对象,修改后再序列化,从根本上规避正则风险。
- ✅ 正则仅适用于简单、可信、格式严格的 JSON 片段(如日志脱敏、前端快速掩码)。
- ? 若字段值可能含转义字符(如 \"),上述正则将失效;此时必须使用 JSON 解析器。
- ? 建议配合 regex101.com 在线调试,并开启「PCRE / Java」模式验证边界行为。
- ? 扩展性提示:如需支持更多字段,只需修改 (?:Name1|pass) 为 (?:Name1|pass|token|ssn) 即可。
通过精准控制匹配范围与边界条件,该方案在不破坏 JSON 语法的前提下,实现了“不足5位也补足5星”的语义要求,兼顾安全性、可读性与工程实用性。











