本文介绍一种基于 Java 的正则表达式方案,通过环视断言精准匹配每个单词中除首尾外的所有字符,并统一替换为指定掩码字符(如 x),适用于多词、含空格、标点及单/双字符边缘场景。
本文介绍一种基于 java 的正则表达式方案,通过环视断言精准匹配每个单词中除首尾外的所有字符,并统一替换为指定掩码字符(如 `x`),适用于多词、含空格、标点及单/双字符边缘场景。
在数据脱敏或前端展示敏感词汇(如人名、地名、地址)时,常需保留单词首尾字符以维持可读性,同时隐藏中间内容。例如将 "India" 变为 "Ixxxa"、"White House building" 变为 "Wxxxe Hxxxe bxxxxxxg"。关键难点在于:不能简单按位置或全局替换,而需按“每个非空白单元”独立识别首尾边界。
推荐正则表达式为:
(?<p>该模式使用 <strong>Java 风格的 Unicode 感知环视(lookaround)</strong>:</p>
- (?
- \S:匹配任意非空白字符(即目标替换对象);
- (?=\S):正向先行断言(positive lookahead),要求当前字符右侧紧邻一个非空白字符。
三者组合,等价于:“匹配一个既不是单词开头、也不是单词结尾的非空白字符”——完美避开首尾,且天然支持空格分隔的多词字符串、标点符号(如 !@#$% → !xxx%)及各种边界情况(如单字符 "a" 不变、双字符 "ab" 也不变,仅 "abc" → "axc")。
✅ 完整 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%
⚠️ 注意事项:
- 该正则不依赖单词边界 ( 在连字符、下划线或标点处可能失效),而是严格基于空白符分隔逻辑,更鲁棒;
- Java 中需对反斜杠双重转义(\S),切勿写成 S,否则编译报错;
- 若需适配其他语言(如 JavaScript),需注意其不支持可变长度后行断言(lookbehind),此时应改用 split() + map() 分词处理;
- 如需自定义掩码字符(如 * 或 #),仅需修改 replaceAll(regex, "*") 中的第二个参数即可。
此方案简洁、高效、无副作用,是实现“首尾保留式文本掩码”的标准实践。











