replace按字面值替换,不解析正则;replaceAll基于正则表达式匹配后替换。前者安全高效,适合固定文本;后者功能强但易出错,需注意元字符转义与反斜杠双重转义。

Java 中 replace 和 replaceAll 都用于字符串替换,但作用机制完全不同:前者按字面值替换,后者基于正则表达式匹配后替换。
replace:简单、安全的字面量替换
replace(CharSequence target, CharSequence replacement) 会将字符串中所有与 target 完全相等的子串 替换为 replacement。它不解析正则元字符,适合处理固定文本。
- 参数类型是
CharSequence(支持String、StringBuilder等),不是正则表达式 - 即使传入
"."或"\d",也只当普通字符处理,不会触发正则含义 - 推荐用于明确知道要替换什么字面内容的场景,比如统一修改分隔符、清理空格、替换关键词
示例:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
String s = "a.b.c";
System.out.println(s.replace(".", "-")); // 输出:a-b-c(不是正则匹配,只是把每个点号换成短横)replaceAll:基于正则表达式的强大替换
replaceAll(String regex, String replacement) 先用第一个参数作为正则表达式去匹配,再将匹配结果替换成第二个参数。它功能强,但也更易出错。
- 第一个参数是正则表达式,所以
"."匹配任意字符,"\d+"匹配连续数字,"\s+"匹配空白 - 第二个参数是替换字符串,其中
$1、$2可引用捕获组,$$表示字面量$ - 注意:反斜杠在 Java 字符串中需双写,如想匹配一个反斜杠,正则要写
"\\\"(字符串里两个反斜杠 → 正则里一个反斜杠)
示例:
String s = "price: 123, qty: 45";
System.out.println(s.replaceAll("\d+", "N")); // 输出:price: N, qty: N
System.out.println(s.replaceAll("(\w+):\s*(\d+)", "$1=$2")); // 输出:price=123, qty=45容易踩坑的几个关键点
-
replace不支持正则,但replaceAll支持 —— 别用错方法,否则替换逻辑完全不对 - 想替换特殊字符(如
.、*、?、\)时:
•replace直接传入即可(如s.replace("*", "x"))
•replaceAll必须转义(如s.replaceAll("\*", "x"),因为*是正则元字符) - 如果只是想替换第一次出现的内容,用
replaceFirst(String regex, String replacement),它和replaceAll一样走正则,但只换一次 - 性能上,
replace更快,因为无正则编译与匹配开销;高频简单替换优先选它
什么时候该用哪个?一句话判断
- 你要替换的是“确切的一段文字”,比如把所有
"old"换成"new"→ 用replace - 你要替换的是“符合某种模式的文本”,比如所有邮箱、所有连续数字、所有带括号的注释 → 用
replaceAll - 你不确定输入是否含正则元字符,又想安全替换字面量 → 用
replace最稳妥
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










