下面我将详细介绍这些方法,并提供清晰的代码示例。

核心方法概览
| 方法 | 来源 | 是否改变原字符串 | 描述 | 特点 |
|---|---|---|---|---|
replace(char old, char new) |
String |
是 (返回新字符串) | 替换所有单个字符 | 最基础的字符替换 |
replace(CharSequence old, CharSequence new) |
String |
是 (返回新字符串) | 替换所有子序列(字符串) | 功能最强大,最常用 |
replaceFirst(String regex, String replacement) |
String |
是 (返回新字符串) | 替换第一个匹配正则表达式的部分 | 基于正则表达式,只替换第一个 |
replaceAll(String regex, String replacement) |
String |
是 (返回新字符串) | 替换所有匹配正则表达式的部分 | 基于正则表达式,替换所有 |
replace(String target, String replacement) |
StringBuilder / StringBuffer |
是 (修改对象本身) | 替换所有子序列 | 在可变字符串对象上直接操作 |
String.replace() 方法 (最常用)
这是最直接、最常用的字符串替换方法,它不依赖于正则表达式,因此如果你只想替换固定的文本,这是首选。
a) replace(char oldChar, char newChar)
替换字符串中所有出现的旧字符 oldChar 为新字符 newChar。
示例:
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) replace(CharSequence target, CharSequence replacement)
这是最常用、最强大的 String 替换方法,它替换字符串中所有出现的 target 子串为 replacement 子串。CharSequence 是 String 和 StringBuilder 等的父接口。

示例:
public class ReplaceExample {
public static void main(String[] args) {
String str = "I like Java, and Java is fun.";
// 将所有的 "Java" 替换为 "Python"
String newStr1 = str.replace("Java", "Python");
System.out.println("替换后: " + newStr1);
// 输出: I like Python, and Python is fun.
// 将空格 " " 替换为下划线 "_"
String newStr2 = str.replace(" ", "_");
System.out.println("替换后: " + newStr2);
// 输出: I_like_Java,_and_Java_is_fun.
// 注意:大小写敏感
String newStr3 = str.replace("java", "Python"); // 不会发生替换
System.out.println("替换后: " + newStr3);
// 输出: I like Java, and Java is fun. (与原字符串相同)
}
}
基于正则表达式的替换方法
当你需要更复杂的替换规则时,例如替换数字、特定格式的文本等,就需要使用正则表达式。
a) replaceAll(String regex, String replacement)
替换字符串中所有匹配正则表达式 regex 的部分为 replacement。
关键点:
regex是一个正则表达式。- 在
replacement字符串中有特殊含义,用于引用正则表达式中的捕获组。
示例:
public class ReplaceRegexExample {
public static void main(String[] args) {
String str = "My phone numbers are 123-4567 and 987-6543.";
// 使用正则表达式 \d 匹配所有数字,并用 "#" 替换
// 注意:在 Java 字符串中,反斜杠需要双写 "\\d"
String newStr = str.replaceAll("\\d", "#");
System.out.println("替换后: " + newStr);
// 输出: My phone numbers are ###-#### and ###-####.
// 匹配所有连续的数字(一个或多个)
String newStr2 = str.replaceAll("\\d+", "[NUM]");
System.out.println("替换后: " + newStr2);
// 输出: My phone numbers are [NUM]-[NUM] and [NUM]-[NUM].
// 使用捕获组
String str2 = "apple,banana,orange";
// 匹配 "," 并在其后添加一个空格
String newStr3 = str2.replaceAll(",", ", ");
System.out.println("替换后: " + newStr3);
// 输出: apple, banana, orange
}
}
b) replaceFirst(String regex, String replacement)
与 replaceAll 类似,但它只替换第一个匹配正则表达式 regex 的部分。
示例:
public class ReplaceFirstExample {
public static void main(String[] args) {
String str = "apple,banana,orange,apple";
// 只替换第一个 "apple"
String newStr = str.replaceFirst("apple", "grape");
System.out.println("替换后: " + newStr);
// 输出: grape,banana,orange,apple
// 只替换第一个匹配的数字
String str2 = "id: 123, status: active, id: 456";
String newStr2 = str2.replaceFirst("\\d", "X");
System.out.println("替换后: " + newStr2);
// 输出: id: X23, status: active, id: 456
}
}
StringBuilder 和 StringBuffer 的 replace() 方法
String 是不可变的,每次替换操作都会创建一个新的 String 对象,这在频繁修改字符串时可能会影响性能。StringBuilder 和 StringBuffer 是可变的,它们的 replace() 方法直接在对象上进行修改,效率更高。
方法签名:
StringBuilder replace(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"
// 注意:String的索引从0开始,"World"的索引是6到10
sb.replace(6, 11, "Java");
System.out.println("替换后: " + sb.toString());
// 输出: Hello Java
// 在开头插入 "The "
sb.replace(0, 0, "The "); // 在0位置,替换0个字符,相当于插入
System.out.println("替换后: " + sb.toString());
// 输出: The Hello Java
}
}
总结与最佳实践
| 场景 | 推荐方法 | 原因 |
|---|---|---|
| 简单、固定的文本替换 | String.replace(CharSequence target, CharSequence replacement) |
代码清晰直观,不涉及复杂的正则表达式。 |
| 需要复杂的模式匹配(如数字、邮箱等) | String.replaceAll() 或 String.replaceFirst() |
正则表达式提供了强大的模式匹配能力。 |
| 在循环或需要频繁修改字符串时 | StringBuilder.replace() 或 StringBuffer.replace() |
避免了创建大量临时 String 对象,性能更优。 |
| 只替换第一个匹配项 | String.replaceFirst() |
明确表达“只替换一次”的意图。 |
重要提示:
- 字符串不可变性:
String的所有replace方法都返回一个新的String对象,原字符串不会被修改。 - 大小写敏感:
replace方法是大小写敏感的。"Java".replace("java", "C++")不会发生任何替换。 - 正则表达式陷阱:使用
replaceAll和replaceFirst时,一定要记得将\在字符串中写成\\,例如匹配数字\d要写成"\\d"。 在替换字符串中有特殊含义,如果要用 本身,需要写成\$。
