replace按字面值替换,安全简单;replaceAll基于正则表达式,功能强但需转义元字符;选择依据是替换固定文本用replace,按模式匹配用replaceAll。

Java 中 replace 和 replaceAll 都用于替换字符串,但它们的机制和适用场景完全不同:前者按字面值替换,后者基于正则表达式匹配替换。用错容易出 bug,比如想替换点号 . 却被当成正则元字符处理。
replace:简单、安全的字面替换
replace(CharSequence target, CharSequence replacement) 会把所有出现的 字面值 子串替换成新内容,不涉及正则。适合替换固定字符、符号或单词,无需转义特殊字符。
- 支持
char或CharSequence(如String)参数,例如"a.b.c".replace('.', '_')直接把每个点换成下划线,结果是"a_b_c" - 如果目标串为空(
""),会在每个字符之间插入替换串,例如"abc".replace("", "X")得到"XaXbXcX" - 目标不存在时返回原字符串,不会抛异常
replaceAll:正则替换,功能强但需谨慎
replaceAll(String regex, String replacement) 的第一个参数是正则表达式,意味着 .、*、+、?、 等都有特殊含义。必须对这些字符进行转义才能表示字面意思。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 想替换所有点号,得写成
"a.b.c".replaceAll("\.", "_")—— 因为.在正则中匹配任意字符,双反斜杠才是传递给正则引擎的单个. - 替换中的
$1、$2可引用捕获组,例如"name=John&age=30".replaceAll("name=(\w+)", "user=$1")结果为"user=John&age=30" - 如果传入非法正则(如
"["),会抛PatternSyntaxException
什么时候该用哪个?
判断依据只有一个:你要替换的是**固定文本**,还是需要**按模式匹配**。
立即学习“Java免费学习笔记(深入)”;
- 换掉某个标点、空格、特定单词(如把所有
"old"换成"new")→ 优先用replace,更直观、无正则风险 - 要替换所有数字
"\d+"、所有空白"\s+"、或者按格式提取后重构(如日期格式转换)→ 必须用replaceAll - 不确定输入是否含正则元字符,又想做字面替换?可以用
Pattern.quote()包装目标串:str.replaceAll(Pattern.quote("."), "_")
别忘了还有 replaceFirst 和 replaceAll 的兄弟方法
如果只想换第一个匹配项,用 replaceFirst(String regex, String replacement);它也走正则,不是字面替换。没有 replaceFirst 的字面版,所以首次替换固定文本仍建议用 replace 配合 indexOf + 字符串拼接,或用 StringBuilder。

















