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

Java中如何仅单次移除字符串中与指定字符串匹配的对应字符?

字符串仅移除每个匹配字符一次的简便实现

结论

完全可以用JDK自带的字符串相关API实现,不需要手写计数for循环,两种常用的简洁方案如下:

方案1:replaceFirst 实现(推荐,兼容性最高)

该方案不需要复杂正则书写,逻辑简单不易出错:

  • 如果B是固定值,直接链式调用即可,一行代码搞定:
    String result = "aabbccdd".replaceFirst("a", "").replaceFirst("b", "").replaceFirst("c", "").replaceFirst("d", "");
    // 输出结果:abcd
    
  • 如果B是动态值,配合流式处理即可适配任意B字符串:
    public class Test {
        public static void main(String[] args) {
            String a = "aabbccdd";
            String b = "abcd";
            
            String result = IntStream.range(0, b.length())
                    .mapToObj(i -> String.valueOf(b.charAt(i)))
                    .reduce(a, (currentStr, charToRemove) -> currentStr.replaceFirst(charToRemove, ""));
            
            System.out.println(result); // 输出结果:abcd
        }
    }
    

JDK8以下不支持流式的场景,也可以写简化for循环调用replaceFirst,比自己遍历字符计数的实现要简洁很多

方案2:replaceAll 配合正则实现

如果要单次调用replaceAll完成需求,可以动态拼接正则匹配每个目标字符的第一次出现:

import java.util.regex.Pattern;
import java.util.stream.Collectors;

public class Test {
    public static void main(String[] args) {
        String a = "aabbccdd";
        String b = "abcd";
        
        // 拼接正则,自动处理正则特殊转义字符
        String regex = b.chars()
                .mapToObj(c -> "(.*?)" + Pattern.quote(String.valueOf((char) c)))
                .collect(Collectors.joining("")) + "(.*)";
        // 拼接所有捕获分组实现替换
        String result = a.replaceAll(regex, IntStream.rangeClosed(1, b.length() + 1)
                .mapToObj(i -> "$" + i)
                .collect(Collectors.joining("")));
        
        System.out.println(result); // 输出结果:abcd
    }
}

注意事项

  • 不要直接使用a.replaceAll("[" + b + "]", ""),该写法会删除A中所有和B匹配的字符,最终得到空字符串,不符合仅删除一次的需求。
  • 如果B中包含.、*、+这类正则元字符,一定要用Pattern.quote()包裹要匹配的字符,避免正则解析错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 20:54:07