如何从字符串s1中移除所有出现在字符串s2中的字符?
解决从字符串s1中移除所有s2出现字符的问题
哦,我懂你的困扰了!你用replace(s2, "")没生效的核心原因是:Java的String.replace(CharSequence, CharSequence)方法是替换整个匹配的连续子串,而不是逐个移除s2里的每个独立字符。比如你的例子中,s2是"mur",它只会在s1里寻找连续的"mur"字符串,显然"Computer"里根本不存在这个子串,所以原字符串自然毫无变化。
下面给你几种实用的解决方案,按需选择:
方法1:手动遍历字符构建结果(基础易懂)
这种方法逻辑直观,适合新手理解:遍历s1的每个字符,只保留那些不在s2里的字符,用StringBuilder来高效拼接结果。
String s1 = "Computer"; String s2 = "mur"; StringBuilder result = new StringBuilder(); for (char c : s1.toCharArray()) { // 检查当前字符是否不在s2中 if (s2.indexOf(c) == -1) { result.append(c); } } System.out.println(result.toString()); // 输出:Copte
方法2:正则表达式替换(简洁高效)
利用正则的字符类特性,把s2里的所有字符转成[xxx]格式,然后替换所有匹配的字符为空。注意要用Pattern.quote()处理s2,避免s2包含正则特殊字符(比如^、.、*)时出错。
import java.util.regex.Pattern; String s1 = "Computer"; String s2 = "mur"; // 构建正则字符类,比如"[mur]" String regex = "[" + Pattern.quote(s2) + "]"; String result = s1.replaceAll(regex, ""); System.out.println(result); // 输出:Copte
方法3:Java 8+ 流操作(简洁现代)
如果你的项目用Java 8及以上,流操作能写出更简洁的代码:
import java.util.stream.Collectors; String s1 = "Computer"; String s2 = "mur"; String result = s1.chars() .mapToObj(c -> String.valueOf((char) c)) .filter(c -> !s2.contains(c)) .collect(Collectors.joining()); System.out.println(result); // 输出:Copte
优化版:用HashSet提升性能(适合大字符串)
如果s1或s2的长度很大,上面方法里的indexOf或contains是O(n)时间复杂度,用HashSet存储s2的字符可以把查询降到O(1),提升效率:
import java.util.HashSet; import java.util.Set; String s1 = "Computer"; String s2 = "mur"; Set<Character> charsToRemove = new HashSet<>(); for (char c : s2.toCharArray()) { charsToRemove.add(c); } StringBuilder result = new StringBuilder(); for (char c : s1.toCharArray()) { if (!charsToRemove.contains(c)) { result.append(c); } } System.out.println(result.toString()); // 输出:Copte
内容的提问来源于stack exchange,提问作者Oleg Khegay
相关产品推荐
相关产品推荐

