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

Java中如何用正则表达式移除出现2次及以上的字符?

用正则实现移除字符串中出现2次及以上的字符

当然可以用正则实现这个需求,你之前的写法只针对连续重复的字符,而题目要求的是整个字符串中出现次数≥2的字符(不管是否连续),所以才会出现结果不符合预期的情况。

实现方案

可以通过两次正则替换达成目标,核心思路是:先删掉所有「后面还会重复出现」的字符,再删掉所有「前面已经出现过」的字符,最终只保留仅出现一次的字符。

Java 代码示例:

// 区分大小写的处理逻辑
String result = s.replaceAll("(.)(?=.*\\1)", "").replaceAll("(.)(?<=.*\\1)", "");

// 如需不区分大小写,添加 (?i) 标志
String caseInsensitiveResult = s.replaceAll("(?i)(.)(?=.*\\1)", "").replaceAll("(?i)(.)(?<=.*\\1)", "");

正则解释

  1. 第一个正则 (.)(?=.*\\1):

    • (.):捕获任意单个字符(存入捕获组1)
    • (?=.*\\1):正向预查,判断当前字符之后的字符串中是否还存在相同字符(\\1 是对捕获组1的反向引用)
    • 此替换会删掉所有「后续还有重复」的字符
  2. 第二个正则 (.)(?<=.*\\1):

    • (.):捕获任意单个字符
    • (?<=.*\\1):反向预查,判断当前字符之前的字符串中是否已存在相同字符
    • 此替换会删掉所有「前面已经出现过」的剩余重复字符

验证示例

  • 对于 "racecar":
    第一次替换后得到 "ecar",第二次替换删掉前面出现过的 c、a、r,最终结果为 "e",符合预期。
  • 对于 "aabbccc":
    第一次替换后仅剩最后一个 c,第二次替换删掉这个前面有重复的 c,最终结果为 "",符合预期。
  • 对于 "Hello world":
    第一次替换删掉重复的 l、o,第二次替换删掉剩余的重复 l,最终结果为 "He wrd",符合预期。

为什么你之前的写法不对

  • s.replaceAll(".{2,}", ""):匹配连续2个及以上的任意字符,会直接删掉所有连续的多字符片段,完全不符合「移除出现多次的字符」的需求。
  • s.replaceAll("[a-z]{2,}", ""):仅匹配连续2个及以上的小写字母,只处理连续重复,无法覆盖非连续的重复字符(比如 "racecar" 中的 r、a、c)。

内容的提问来源于stack exchange,提问作者coolsebbe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 20:38:24