如何用正则表达式屏蔽每个单词首尾字符外的所有字符?
问题:正则表达式实现单词首尾字符保留、中间字符替换为屏蔽符
是否存在正则表达式可以屏蔽每个单词中除首尾字符外的所有字符?例如处理以下单词列表:
India Australia North America South America White House building
期望输出如下:
Ixxxa Axxxxxxxa Nxxxh Axxxxxa Sxxxh Axxxxxa Wxxxe Hxxxe bxxxxxxg
当前使用如下Java表达式时,会连空格和末尾字符一同屏蔽:
return input.replaceAll("[\\s()]+", " ").replaceAll("\\d(?=(?:\\D*\\d){4})","X");
解决方案
你需要的正则逻辑是匹配单词中间的每个非首尾字符,然后替换为x(或你需要的屏蔽符)。之前的表达式完全不对,因为它是针对数字的匹配逻辑,和需求不沾边。
正确的正则替换方案
在Java中,可以使用以下正则实现需求:
return input.replaceAll("\\B\\w\\B", "x");
逻辑解释
\\B:匹配非单词边界,也就是说,这个位置既不是单词的开头也不是结尾。\\w:匹配任意单词字符(字母、数字、下划线,如果你需要只匹配字母,可以换成[a-zA-Z])。- 整个表达式的意思是:匹配每个单词中既不是开头也不是结尾的字符,将其替换为
x。
验证结果
用你的测试输入运行这段代码,会得到完全符合期望的输出:
Ixxxa Axxxxxxxa Nxxxh Axxxxxa Sxxxh Axxxxxa Wxxxe Hxxxe bxxxxxxg
扩展说明
如果需要处理带特殊字符的单词(比如包含连字符),或者只想替换字母,可以调整正则:
- 仅替换字母的中间字符:
\\B[a-zA-Z]\\B - 处理连字符单词(比如
hello-world变成hxxxo-wxxxd):可以使用更直观的写法,不依赖单词边界:
这个表达式的意思是:匹配不是单词开头、也不是单词结尾的字母,替换为return input.replaceAll("(?<!^)(?!$)[a-zA-Z]", "x");x,连字符这类非字母字符会被保留,单词的首尾字母也会保留。
内容的提问来源于stack exchange,提问作者sheshadri
相关产品推荐
相关产品推荐

