本文介绍一种基于java的正则表达式方案,通过环视断言精准匹配每个单词中除首尾外的所有字符,并统一替换为指定掩码字符(如x),适用于多词、含空格、标点及单/双字符等边界场景。
本文介绍一种基于java的正则表达式方案,通过环视断言精准匹配每个单词中除首尾外的所有字符,并统一替换为指定掩码字符(如x),适用于多词、含空格、标点及单/双字符等边界场景。
在数据脱敏或前端展示优化中,常需对敏感文本(如地名、人名、地址)进行部分掩码——仅保留每个单词的首尾字符,中间字符统一替换为占位符(如 x)。例如将 "North America" 转换为 "Nxxxh Axxxxxa"。关键难点在于:不能简单按位置或全局替换,而必须识别“单词内部”的字符,同时兼容空格、标点、单字符、双字符等边界情况。
推荐使用 基于环视(lookaround)的正则表达式:
(?<p>该表达式含义如下:</p>
- (?前面是一个非空白字符(S);
- \S:匹配任意一个非空白字符(即目标掩码对象);
- (?=\S):正向先行断言(positive lookahead),确保当前字符后面也是一个非空白字符。
三者组合,精准命中「前后均有非空白字符」的中间字符——即每个单词中除首尾外的所有字符。它天然跳过空格、制表符、换行符,也自动绕过单字符(如 "a")和双字符(如 "ab")中的“中间位置”(因不满足前后均为 S 的条件)。
✅ 完整 Java 示例:
String regex = "(?<p>输出结果:</p><pre class="brush:php;toolbar:false;">Ixxxa Axxxxxxxa Nxxxh Axxxxxa Sxxxh Axxxxxa Wxxxe Hxxxe bxxxxxxg a ab axc txxxxxxxxxxxxxxt !xxx%
⚠️ 注意事项:
- 该正则不依赖单词边界(),因此能正确处理带下划线、数字、符号的复合词(如 tthis123_isatest → txxxxxxxxxxxxxxt);
- 单字符("a")和双字符("ab")不会被误掩码,符合语义逻辑;
- Java 中需对反斜杠转义,写作 "(?
- 若需掩码为其他字符(如 * 或 •),仅需修改 replaceAll(regex, "*") 即可;
- 不建议在超长文本中频繁调用 replaceAll;如需高性能批量处理,可结合 Pattern.compile() 预编译正则对象复用。
此方案简洁、健壮、无副作用,是实现「单词级首尾保留掩码」的标准实践。











