replace按字面值替换,适合简单子串替换;replaceAll按正则规则替换,需转义特殊字符,适用于模糊匹配场景。

Java中replace和replaceAll看似都能替换字符串,但用法、原理和适用场景完全不同——初学者常因混淆二者导致替换失败或意外结果。
replace:按字面值替换,不走正则
replace(CharSequence target, CharSequence replacement)只做**纯文本匹配**,把目标子串原样替换成新内容,不管里面有没有正则特殊字符(比如.、*、\)。
- 参数是普通字符串,不是正则表达式
- 支持替换所有匹配项(内部遍历全部替换)
- 适合简单、确定的字符/子串替换,比如把空格换成下划线、把"abc"换成"xyz"
示例:
String s = "a.b*c";
s.replace(".", "@"); // 结果是 "a@b*c" —— 点号被当普通字符处理,没问题
replaceAll:按正则规则替换,必须转义特殊字符
replaceAll(String regex, String replacement)第一个参数是**正则表达式**,第二个参数是替换模板(也支持$1、$0等引用捕获组)。
- 点号
.、星号*、问号?、反斜杠\等都按正则含义解析 - 想匹配字面意义的
.,得写成"\."(Java字符串里要双写反斜杠) - 替换内容中
$和有特殊含义,需用\$或\\转义
示例:
String s = "a.b*c";
s.replaceAll("\.", "@"); // 正确:匹配字面点号 → "a@b*c"
s.replaceAll(".", "@"); // 错误:点号在正则中匹配任意字符 → "@@@@@@@"
s.replaceAll("\*", "#"); // 正确:星号需转义 → "a.b#c"
常见踩坑与应对建议
- 想替换固定字符串却用了
replaceAll→ 改用replace更安全、更高效 - 用
replaceAll时忘记转义正则元字符 → 检查目标字符串是否含. * + ? ^ $ | [ ] ( ) { },通通加\ - 替换内容里要输出
$或→ 写成"\$"或"\\\"(一个反斜杠在正则替换中需写四个\) - 不确定该用哪个?先试
replace;只有需要“模糊匹配”(如所有数字、所有空白、邮箱格式等)才上replaceAll
补充:replaceFirst 和 Pattern.compile 更精细的控制
如果只需替换第一个匹配项,用replaceFirst(String regex, String replacement);
如果同一正则反复使用,建议预编译:Pattern p = Pattern.compile("\d+"); p.matcher(s).replaceAll("N"),避免重复解析正则,提升性能。

















