三个方法的基本定义
Java中的String类提供了三个用于替换内容的方法,分别是replace、replaceAll和replaceFirst,三者的核心作用都是替换字符串中的部分内容,但匹配和替换的规则完全不同。

replace方法
replace方法有两个重载版本,分别是replace(char oldChar, char newChar)和replace(CharSequence target, CharSequence replacement),它的替换逻辑是匹配所有与指定字符或字符序列完全相同的内容,不支持正则表达式匹配。
replaceAll方法
replaceAll的方法签名为replaceAll(String regex, String replacement),第一个参数是正则表达式,方法会匹配所有符合该正则表达式的子串,全部替换为第二个参数指定的内容。
replaceFirst方法
replaceFirst的方法签名为replaceFirst(String regex, String replacement),第一个参数同样是正则表达式,但是只会替换第一个符合正则表达式的子串,后续的匹配内容不会被替换。
核心差异对比
三个方法的核心差异主要体现在匹配规则、替换范围和参数要求三个方面,具体对比如下:
| 方法名 | 第一个参数要求 | 匹配规则 | 替换范围 |
|---|---|---|---|
| replace | 字符或普通字符序列 | 完全匹配指定内容 | 所有匹配的内容 |
| replaceAll | 正则表达式字符串 | 匹配符合正则的子串 | 所有匹配的内容 |
| replaceFirst | 正则表达式字符串 | 匹配符合正则的子串 | 仅第一个匹配的内容 |
代码示例说明差异
下面通过具体的代码示例来直观展示三个方法的不同表现。
普通字符替换场景
当替换的内容是普通字符,不涉及正则特殊字符时,replace和replaceAll的表现一致,都会替换所有匹配的内容:
public class StringReplaceTest {
public static void main(String[] args) {
String str = "hello world hello java";
// replace替换所有hello
String replaceResult = str.replace("hello", "hi");
System.out.println("replace结果:" + replaceResult);
// replaceAll替换所有hello,此时第一个参数是普通字符串,无正则特殊字符
String replaceAllResult = str.replaceAll("hello", "hi");
System.out.println("replaceAll结果:" + replaceAllResult);
// replaceFirst只替换第一个hello
String replaceFirstResult = str.replaceFirst("hello", "hi");
System.out.println("replaceFirst结果:" + replaceFirstResult);
}
}
上述代码的输出结果为:
replace结果:hi world hi java replaceAll结果:hi world hi java replaceFirst结果:hi world hello java
包含正则特殊字符的场景
当第一个参数包含正则表达式的特殊字符时,replace和replaceAll的表现会出现明显差异,replace会把特殊字符当作普通字符处理,而replaceAll会按照正则规则匹配:
public class StringReplaceRegexTest {
public static void main(String[] args) {
String str = "a1b a2b a3b";
// replace把.当作普通字符,匹配所有的.字符
String replaceResult = str.replace(".", "#");
System.out.println("replace替换.结果:" + replaceResult);
// replaceAll把.当作正则特殊字符,匹配任意单个字符,所以所有单个字符都会被替换
String replaceAllResult = str.replaceAll(".", "#");
System.out.println("replaceAll替换.结果:" + replaceAllResult);
// replaceFirst只替换第一个符合正则的字符
String replaceFirstResult = str.replaceFirst(".", "#");
System.out.println("replaceFirst替换.结果:" + replaceFirstResult);
}
}
上述代码的输出结果为:
replace替换.结果:a1b a2b a3b replaceAll替换.结果:######### replaceFirst替换.结果:#1b a2b a3b
如果要让replaceAll把.当作普通字符处理,需要对正则特殊字符进行转义:
public class StringReplaceEscapeTest {
public static void main(String[] args) {
String str = "a1b a2b a3b";
// 对.进行转义,匹配普通的点字符
String result = str.replaceAll("\.", "#");
System.out.println("转义后replaceAll结果:" + result);
}
}
输出结果为:
转义后replaceAll结果:a1b a2b a3b
使用注意事项
- 如果不需要正则匹配,优先使用replace方法,避免因为误写正则特殊字符导致替换结果不符合预期,同时replace的性能略高于replaceAll。
- 使用replaceAll和replaceFirst时,要注意第一个参数的正则合法性,如果正则写法错误会抛出
PatternSyntaxException异常。 - 替换内容中包含
$等特殊字符时,replaceAll和replaceFirst会对$进行分组引用处理,如果需要原样替换,需要对替换内容中的特殊字符进行转义,或者使用Matcher.quoteReplacement方法处理替换字符串。
总结
replace、replaceAll、replaceFirst三个方法的核心区别在于匹配规则和替换范围:replace仅支持普通字符序列匹配,替换所有匹配内容;replaceAll支持正则表达式匹配,替换所有匹配内容;replaceFirst支持正则表达式匹配,仅替换第一个匹配内容。在实际开发中,需要根据替换需求选择合适的方法,避免因为对正则特殊字符的处理不当导致业务逻辑错误。
JavaStringreplacereplaceAllreplaceFirst修改时间:2026-07-05 05:48:11