在 Java 中,去掉字符串中的字符有多种方法,具体取决于你的需求:是想去掉某个特定字符、所有某种类型的字符,还是根据位置去掉。

下面我将为你详细介绍几种最常用和最有效的方法,并提供代码示例。
使用 String.replace() 或 String.replaceAll() / String.replaceFirst()
这是最直接、最简单的方法,适用于你想替换掉某个或某些字符的场景。
去掉所有指定的单个字符
使用 String.replace(CharSequence target, CharSequence replacement),将要去掉的字符作为 target,空字符串 作为 replacement。
示例:去掉字符串中所有的 'a'

public class RemoveCharExample {
public static void main(String[] args) {
String originalStr = "Java is a popular programming language.";
char charToRemove = 'a';
// 将所有的 'a' 替换为空字符串
String newStr = originalStr.replace(String.valueOf(charToRemove), "");
System.out.println("原始字符串: " + originalStr);
System.out.println("去掉 '" + charToRemove + "' 后的字符串: " + newStr);
// 输出: 原始字符串: Java is a popular programming language.
// 输出: 去掉 'a' 后的字符串: Jv is populr progrmming lnguge.
}
}
去掉所有匹配正则表达式的字符
使用 String.replaceAll(String regex, String replacement),你可以使用正则表达式来定义更复杂的规则,比如去掉所有数字、所有非字母字符等。
示例 1:去掉所有数字
public class RemoveRegexExample {
public static void main(String[] args) {
String originalStr = "我的电话是 138-1234-5678,邮政编码是 100000。";
// 使用正则表达式 \d 匹配所有数字 [0-9]
String newStr = originalStr.replaceAll("\\d", "");
System.out.println("原始字符串: " + originalStr);
System.out.println("去掉所有数字后的字符串: " + newStr);
// 输出: 原始字符串: 我的电话是 138-1234-5678,邮政编码是 100000。
// 输出: 去掉所有数字后的字符串: 我的电话是 -,,邮政编码是 。。
}
}
示例 2:去掉所有空格
String originalStr = "This is a test string with spaces.";
String newStr = originalStr.replaceAll(" ", "");
System.out.println(newStr); // 输出: Thisisateststringwithspaces.
示例 3:去掉所有标点符号

String originalStr = "Hello, World! This is a test.";
// 使用正则表达式 [^a-zA-Z0-9\s] 匹配所有非字母、非数字、非空白字符
String newStr = originalStr.replaceAll("[^a-zA-Z0-9\\s]", "");
System.out.println(newStr); // 输出: Hello World This is a test
注意:
replace()是普通字符串替换,不涉及正则表达式。replaceAll()和replaceFirst()使用的是正则表达式,如果你只想替换第一个匹配项,可以使用replaceFirst()。- 在正则表达式中,
\[]^等字符是特殊字符,如果要用它们的字面意思,需要用\转义,想去掉点 ,需要写成\\.。
使用 StringBuilder 或 StringBuffer 循环构建
这种方法更灵活,特别是当你想在去掉字符的同时执行一些额外逻辑(比如判断字符类型)时,它的性能通常也更好,尤其是在处理非常长的字符串时,因为它避免了创建多个中间字符串对象。
示例:遍历字符串,只保留字母
public class RemoveCharLoopExample {
public static void main(String[] args) {
String originalStr = "H3e7l9l1o, W2o1r5l4d!";
StringBuilder sb = new StringBuilder(); // 使用 StringBuilder 进行高效拼接
for (int i = 0; i < originalStr.length(); i++) {
char c = originalStr.charAt(i);
// 只保留字母字符 (a-z, A-Z)
if (Character.isLetter(c)) {
sb.append(c);
}
// 如果要去掉某个特定字符,可以写:
// if (c != 'a') { ... }
}
String newStr = sb.toString();
System.out.println("原始字符串: " + originalStr);
System.out.println("去掉所有非字母字符后的字符串: " + newStr);
// 输出: 原始字符串: H3e7l9l1o, W2o1r5l4d!
// 输出: 去掉所有非字母字符后的字符串: HelloWorld
}
}
使用 Java 8 Stream API (函数式风格)
如果你使用的是 Java 8 或更高版本,Stream API 提供了一种非常简洁和函数式的处理方式。
示例:去掉所有空格
import java.util.stream.Collectors;
public class RemoveCharStreamExample {
public static void main(String[] args) {
String originalStr = "Java Stream is powerful and concise.";
// 将字符串转换为字符流,过滤掉空格,然后重新拼接
String newStr = originalStr.chars() // 获取一个 IntStream
.filter(c -> c != ' ') // 过滤掉字符码为 ' ' 的字符
.mapToObj(c -> String.valueOf((char) c)) // 将 int 转换回 Character 对象
.collect(Collectors.joining()); // 将流中的元素连接成一个字符串
System.out.println("原始字符串: " + originalStr);
System.out.println("去掉所有空格后的字符串: " + newStr);
// 输出: 原始字符串: Java Stream is powerful and concise.
// 输出: 去掉所有空格后的字符串: JavaStreamispowerfulandconcise.
}
}
更复杂的例子:去掉所有元音字母
String originalStr = "This is another example using Stream.";
String newStr = originalStr.chars()
.filter(c -> !"aeiouAEIOU".contains(String.valueOf((char)c)))
.mapToObj(c -> String.valueOf((char)c))
.collect(Collectors.joining());
System.out.println(newStr); // 输出: Ths s nthr xmpl sing Strm.
总结与如何选择
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
replace() / replaceAll() |
代码最简洁,一行搞定。 | 功能相对固定,正则表达式可能对新手不友好。 | 快速替换特定字符或符合简单正则规则的字符。 |
StringBuilder 循环 |
性能最好,灵活性最高,可嵌入复杂逻辑。 | 代码稍长,不如函数式方法优雅。 | 对性能要求高,或需要在处理时进行复杂判断的场景。 |
| Java 8 Stream API | 代码简洁优雅,符合函数式编程思想。 | 可能有轻微的性能开销(通常可忽略),需要理解流式操作。 | 使用 Java 8+,追求代码简洁和可读性的场景。 |
简单选择指南:
- 只想去掉一个或几个固定的字符? -> 用
String.replace()。 - 想去掉所有数字、所有空格、所有标点符号等? -> 用
String.replaceAll()+ 正则表达式。 - 处理超长字符串,或者要去掉字符的逻辑很复杂? -> 用
StringBuilder循环。 - 用的是 Java 8+,想写点“高级”又简洁的代码? -> 用
Stream API。
