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
相关产品推荐
相关产品推荐

