核心方法概览
| 方法 | 所属类 | 功能描述 | 是否改变原字符串 | 线程安全 |
|---|---|---|---|---|
replace(char old, char new) |
String |
替换所有单个字符 | 是 | 是 |
replace(CharSequence old, CharSequence new) |
String |
替换所有字符序列(子串) | 是 | 是 |
replaceAll(String regex, String replacement) |
String |
使用正则表达式替换所有匹配项 | 是 | 是 |
replaceFirst(String regex, String replacement) |
String |
使用正则表达式替换第一个匹配项 | 是 | 是 |
replace(String target, String replacement) |
StringBuilder / StringBuffer |
替换所有子串(可操作原对象) | 否(StringBuffer可) |
StringBuffer是,StringBuilder否 |
重要提示:在 Java 中,String 对象是不可变的(immutable),这意味着所有 String 类的替换方法都不会修改原始字符串,而是返回一个新的字符串,你必须用新的变量来接收这个结果。

String.replace() - 最常用的通用替换
这是最简单、最直接的替换方法,适用于不需要正则表达式的场景。
a) 替换单个字符
public class ReplaceExample {
public static void main(String[] args) {
String str = "hello world";
// 将所有 'l' 替换为 'p'
String newStr = str.replace('l', 'p');
System.out.println("原始字符串: " + str); // 输出: hello world
System.out.println("替换后字符串: " + newStr); // 输出: hepwo worpd
}
}
b) 替换字符序列(子串)
这个重载方法非常强大,可以替换任意长度的子串。
public class ReplaceExampleSubstring {
public static void main(String[] args) {
String str = "I like Java, Java is great.";
// 将所有 "Java" 替换为 "Python"
String newStr = str.replace("Java", "Python");
System.out.println("原始字符串: " + str); // 输出: I like Java, Java is great.
System.out.println("替换后字符串: " + newStr); // 输出: I like Python, Python is great.
}
}
replaceAll() 和 replaceFirst() - 基于正则表达式的替换
当你需要根据某种“模式”来替换字符串时,就应该使用正则表达式。
a) replaceAll(String regex, String replacement)
替换所有匹配正则表达式 regex 的子串。

示例1:移除所有数字
public class ReplaceAllExample {
public static void main(String[] args) {
String str = "我的电话是138-8888-8888,我的邮箱是test@example.com。";
// 正则表达式 \\d 匹配任意一个数字
String newStr = str.replaceAll("\\d", "");
System.out.println("原始字符串: " + str);
System.out.println("替换后字符串: " + newStr); // 输出: 我的电话是-,我的邮箱是test@example.com。
}
}
示例2:规范化多个空格
public class ReplaceAllSpaces {
public static void main(String[] args) {
String str = "这个字符串 有很多 空格。";
// 正则表达式 \\s+ 匹配一个或多个空白字符(空格、制表符、换行等)
String newStr = str.replaceAll("\\s+", " ");
System.out.println("原始字符串: " + str);
System.out.println("替换后字符串: " + newStr); // 输出: 这个字符串 有很多 空格。
}
}
示例3:正则中的特殊字符
在 replacement 参数中,可以使用 来引用捕获组。

$0:表示整个匹配的字符串。$1:表示第一个捕获组 的内容。$2:表示第二个捕获组,以此类推。
public class ReplaceAllWithGroups {
public static void main(String[] args) {
String str = "apple, banana, orange";
// 将 "word, word" 的模式替换为 "word | word"
// (\\w+) 是一个捕获组,匹配一个或多个单词字符
String newStr = str.replaceAll("(\\w+), (\\w+)", "$1 | $2");
System.out.println("原始字符串: " + str);
System.out.println("替换后字符串: " + newStr); // 输出: apple | banana, orange
}
}
b) replaceFirst(String regex, String replacement)
只替换第一个匹配正则表达式 regex 的子串。
public class ReplaceFirstExample {
public static void main(String[] args) {
String str = "error on line 1, error on line 2, error on line 3.";
// 只替换第一个 "error"
String newStr = str.replaceFirst("error", "warning");
System.out.println("原始字符串: " + str);
System.out.println("替换后字符串: " + newStr); // 输出: warning on line 1, error on line 2, error on line 3.
}
}
StringBuilder.replace() 和 StringBuffer.replace() - 可变字符串的替换
当你在一个循环中进行大量字符串拼接和替换操作时,使用 StringBuilder 或 StringBuffer 会更高效,因为它们是可变的。
注意:这个方法的参数是 int start, int end, String str,表示从 start 索引(包含)到 end 索引(不包含)的子串将被替换为 str。
public class StringBuilderReplaceExample {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("hello world");
// 将索引 6 到 11 (即 "world") 替换为 "java"
// 注意:索引是从 0 开始的
sb.replace(6, 11, "java");
System.out.println("StringBuilder 内容: " + sb.toString()); // 输出: hello java
// 与 String 不同,这个方法直接修改了 StringBuilder 对象本身
}
}
总结与最佳实践
| 场景 | 推荐方法 | 理由 |
|---|---|---|
| 简单替换所有字符或固定子串 | String.replace() |
代码最简洁,性能良好。 |
| 需要按“模式”替换所有内容 | String.replaceAll() |
强大的正则表达式支持。 |
| 只需要替换第一个匹配项 | String.replaceFirst() |
精确控制,只替换一次。 |
| 在循环中或需要高性能地构建/修改字符串 | StringBuilder.replace() |
避免了创建大量中间 String 对象,效率更高。 |
| 需要线程安全的字符串修改 | StringBuffer.replace() |
StringBuffer 的所有方法都是同步的,适合多线程环境。 |
一个常见的陷阱:replaceAll 的 符号
如果你想在 replaceAll 的 replacement 参数中直接使用 符号本身,而不是作为特殊字符,你需要用 \\ 来转义它。
String price = "The price is $100.";
// 错误用法:会把 $100 替换成 100,因为 $1 是捕获组
// String newPrice = price.replaceAll("\\$", "USD ");
// 正确用法:用 \\$ 来表示一个字面上的 $ 符号
String newPrice = price.replaceAll("\\$", "USD ");
System.out.println(newPrice); // 输出: The price is USD 100.
希望这份详细的指南能帮助你熟练掌握 Java 中的字符串替换操作!
