replace用于字面量全量替换,replaceall和replacefirst基于正则全局/首次替换;前者不解析正则元字符,后两者需转义且支持捕获组引用。

Java 中 replace、replaceAll 和 replaceFirst 都用于字符串替换,但底层机制和适用场景完全不同:关键区别在于是否使用正则表达式、替换范围、以及参数类型。
replace:基于字符或 CharSequence 的字面量替换
replace 是最简单直接的替换方法,不涉及正则表达式,只做**全量字面匹配与替换**。它有两个重载版本:
-
String replace(char oldChar, char newChar):替换所有指定字符 -
String replace(CharSequence target, CharSequence replacement):替换所有匹配的子串(按字面值,非正则)
例如:"a.b.c".replace(".", "_") → "a_b_c"(点号被当作普通字符处理)"123-456-789".replace("-", "") → "123456789"
⚠️ 注意:即使传入的 target 看起来像正则符号(如 "."、"*"、"\d"),也不会被解析为正则,而是原样匹配。
replaceAll:基于正则表达式的全局替换
replaceAll(String regex, String replacement) 使用正则表达式匹配,并将**所有匹配项**替换成目标字符串。
- 第一个参数是正则表达式,所以
"."匹配任意字符,"\d+"匹配连续数字等 - 第二个参数是替换字符串,支持正则引用(如
$1表示捕获组) - 若需替换字面量的正则元字符(如点号、星号),必须转义:
"\."
例如:"a.b.c".replaceAll(".", "_") → "a_b_c"(正确转义后匹配字面点)"abc123def456".replaceAll("d+", "N") → "abcNdefN"
? 小技巧:如果不确定是否要正则功能,优先避免用 replaceAll,容易因未转义元字符导致意外行为。
replaceFirst:基于正则表达式的首次匹配替换
replaceFirst(String regex, String replacement) 和 replaceAll 的参数规则完全一致,区别仅在于——它只替换**第一个匹配结果**,其余保持不变。
- 同样要求第一个参数是合法正则,需对元字符转义
- 适合“只修正首个问题”、“给首字母加标记”等场景
例如:"cat dog bird cat".replaceFirst("cat", "mouse") → "mouse dog bird cat""price: $19.99, sale: $9.99".replaceFirst("\$\d+\.\d+", "[PRICE]") → "price: [PRICE], sale: $9.99"
补充说明:为什么没有 replaceAll 的“字面量版”?
Java 没有提供类似 replaceAllLiteral 的内置方法,但可以轻松模拟:
- 用
Pattern.quote(target)包裹待替换文本,使其在正则中被视为字面量 - 例如:
str.replaceAll(Pattern.quote("."), "_")等价于安全的字面点替换 - 或者直接用
replace—— 更简洁、无正则开销、不易出错
总结:想简单换掉某个固定子串,用 replace;需要按模式批量处理,用 replaceAll;只需改第一个符合模式的位置,用 replaceFirst。选错方法可能导致空指针、匹配失败或过度替换。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











