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) 的第一个参数是正则表达式,意味着 .、*、+、?、 等都有特殊含义。必须对这些字符进行转义才能表示字面意思。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 想替换所有点号,得写成
"a.b.c".replaceAll("\.", "_")—— 因为.在正则中匹配任意字符,双反斜杠才是传递给正则引擎的单个. - 替换中的
$1、$2可引用捕获组,例如"name=John&age=30".replaceAll("name=(\w+)", "user=$1")结果为"user=John&age=30" - 如果传入非法正则(如
"["),会抛PatternSyntaxException
什么时候该用哪个?
判断依据只有一个:你要替换的是**固定文本**,还是需要**按模式匹配**。
- 换掉某个标点、空格、特定单词(如把所有
"old"换成"new")→ 优先用replace,更直观、无正则风险 - 要替换所有数字
"\d+"、所有空白"\s+"、或者按格式提取后重构(如日期格式转换)→ 必须用replaceAll - 不确定输入是否含正则元字符,又想做字面替换?可以用
Pattern.quote()包装目标串:str.replaceAll(Pattern.quote("."), "_")
别忘了还有 replaceFirst 和 replaceAll 的兄弟方法
如果只想换第一个匹配项,用 replaceFirst(String regex, String replacement);它也走正则,不是字面替换。没有 replaceFirst 的字面版,所以首次替换固定文本仍建议用 replace 配合 indexOf + 字符串拼接,或用 StringBuilder。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










