You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用正则表达式屏蔽每个单词首尾字符外的所有字符?

问题:正则表达式实现单词首尾字符保留、中间字符替换为屏蔽符

是否存在正则表达式可以屏蔽每个单词中除首尾字符外的所有字符?例如处理以下单词列表:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 18:45:08