- 替换所有匹配项 还是 只替换第一个匹配项?
- 是替换单个字符 还是一个子字符串?
- 是否需要考虑大小写?
- 是否需要使用复杂的模式(正则表达式)?
下面我将详细介绍最常用和最核心的几种方法。

String.replace() 方法
这是最常用、最简单的方法,用于替换字符串中的子字符串。
特点:
- 替换所有出现的子字符串。
- 参数是
CharSequence,可以是String或char。 - 返回一个新的字符串,原始字符串不会被修改(因为
String在 Java 中是不可变的)。
方法签名:
public String replace(CharSequence target, CharSequence replacement)
示例代码:
场景1:替换所有匹配的子字符串
public class ReplaceExample {
public static void main(String[] args) {
String str = "hello world, hello java, hello everyone";
// 将所有的 "hello" 替换为 "hi"
String newStr = str.replace("hello", "hi");
System.out.println("原始字符串: " + str);
System.out.println("替换后字符串: " + newStr);
// 输出:
// 原始字符串: hello world, hello java, hello everyone
// 替换后字符串: hi world, hi java, hi everyone
}
}
场景2:替换所有匹配的单个字符
public class ReplaceCharExample {
public static void main(String[] args) {
String str = "apple-pie-recipe";
// 将所有的 '-' 替换为 ' '
String newStr = str.replace('-', ' ');
System.out.println("原始字符串: " + str);
System.out.println("替换后字符串: " + newStr);
// 输出:
// 原始字符串: apple-pie-recipe
// 替换后字符串: apple pie recipe
}
}
String.replaceFirst() 方法
如果你只想替换第一个匹配的子字符串,可以使用这个方法。

特点:
- 只替换第一个匹配项。
- 同样使用
CharSequence作为参数。
方法签名:
public String replaceFirst(String regex, String replacement)
注意:这里的第一个参数是
regex,意味着你可以使用正则表达式来定位要替换的子字符串。
示例代码:
public class ReplaceFirstExample {
public static void main(String[] args) {
String str = "hello world, hello java, hello everyone";
// 只替换第一个 "hello"
String newStr = str.replaceFirst("hello", "hi");
System.out.println("原始字符串: " + str);
System.out.println("替换后字符串: " + newStr);
// 输出:
// 原始字符串: hello world, hello java, hello everyone
// 替换后字符串: hi world, hello java, hello everyone
}
}
String.replaceAll() 方法
这个方法功能非常强大,它使用正则表达式来查找并替换所有匹配的子字符串。
特点:
- 替换所有匹配的子字符串。
- 必须使用正则表达式作为第一个参数。
- 如果要替换的字符串中包含正则表达式的特殊字符(如 , , 等),需要进行转义。
方法签名:
public String replaceAll(String regex, String replacement)
示例代码:
场景1:简单的正则表达式替换
public class ReplaceAllExample {
public static void main(String[] args) {
String str = "order123, order456, order789";
// 使用正则表达式 "order\\d+" 来匹配 "order" 后面跟着一个或多个数字
String newStr = str.replaceAll("order\\d+", "shipped");
System.out.println("原始字符串: " + str);
System.out.println("替换后字符串: " + newStr);
// 输出:
// 原始字符串: order123, order456, order789
// 替换后字符串: shipped, shipped, shipped
}
}
场景2:转义正则表达式特殊字符

假设你想替换一个点 ,在正则表达式中 代表任意字符,所以需要用 \\ 进行转义。
public class ReplaceAllEscapeExample {
public static void main(String[] args) {
String str = "file.txt.bak";
// 错误示范:. 会匹配任意字符,导致结果不符合预期
// String wrongResult = str.replaceAll(".", "_"); // 输出: _______________
// 正确示范:使用 \\\. 来匹配一个真实的点字符
String newStr = str.replaceAll("\\.", "_");
System.out.println("原始字符串: " + str);
System.out.println("替换后字符串: " + newStr);
// 输出:
// 原始字符串: file.txt.bak
// 替换后字符串: file_txt_bak
}
}
StringBuilder.replace() 方法
如果你需要在循环或高频操作中频繁修改字符串内容,使用 StringBuilder 或 StringBuffer 会更高效,因为它们是可变的。
特点:
- 在
StringBuilder或StringBuffer对象上进行原地修改。 - 参数是
int类型的起始索引和结束索引,以及要替换的String。 - 索引范围是
[start, end),即包含start,不包含end。
方法签名:
public StringBuilder replace(int start, int end, String str)
示例代码:
public class StringBuilderReplaceExample {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("Hello, World!");
// 将索引 7 到 12 (即 "World") 替换为 "Java"
// 7: 'W' 的索引
// 12: '!' 的索引
sb.replace(7, 12, "Java");
System.out.println("替换后的内容: " + sb.toString());
// 输出:
// 替换后的内容: Hello, Java!
}
}
总结与选择指南
| 方法 | 替换所有? | 替换单个字符? | 正则表达式? | 是否修改原字符串 | 适用场景 |
|---|---|---|---|---|---|
String.replace() |
是 | 是 | 否 | 否 (返回新串) | 最常用,简单的全局替换。 |
String.replaceFirst() |
否 | 否 | 是 | 否 (返回新串) | 只需要替换第一个匹配项,或用正则定位特定位置。 |
String.replaceAll() |
是 | 否 | 是 | 否 (返回新串) | 需要基于复杂模式(正则)进行全局替换。 |
StringBuilder.replace() |
N/A | N/A | 否 | 是 (修改原对象) | 在循环或高频操作中,为了性能,需要频繁修改字符串内容。 |
如何选择?
- 简单替换所有字符/子串:首选
String.replace(),它最直观、简单。 - 只替换第一个:使用
String.replaceFirst()。 - 需要匹配复杂模式(替换所有数字、所有空格等):使用
String.replaceAll()并编写正则表达式。 - 在循环中多次修改字符串:使用
StringBuilder或StringBuffer的replace()方法,以避免创建过多临时字符串对象,提高性能。
