String.replace()仅作字面量替换,replaceAll()和replaceFirst()基于正则引擎,行为本质不同;需据需求选型,注意元字符转义、性能差异及不可变性。

Java里做字符串替换,String.replace() 最常用,但不是万能的;真要按规则换、换多次、或带逻辑判断,得看 String.replaceAll() 或 String.replaceFirst() —— 它们底层走正则,行为和 replace() 有本质区别。
replace() 只做字面量替换,不认正则
这是最安全、也最容易误用的函数。它把第一个参数当纯字符串处理,哪怕你传了 "\\." 或 "$1",它也不会解析成转义或捕获组。
- 适合场景:替换单个字符、固定子串,比如把所有空格换成下划线:
"a b c".replace(" ", "_") → "a_b_c" - 常见错误:想删掉点号
"file.txt".replace(".", ""),结果所有.都被干掉了——这没错;但若误以为它支持正则(比如想只换开头的点),就会出错 - 注意:它返回新字符串,原字符串不可变;传
null直接抛NullPointerException
replaceAll() 和 replaceFirst() 走正则引擎,小心元字符
这两个方法第一个参数是正则表达式,.、*、$、\ 全部生效。没转义就直接用,大概率替换错甚至报错。
- 典型翻车:
"a.b.c".replaceAll(".", "_")结果是"___"(因为.匹配任意字符);正确写法是"a.b.c".replaceAll("\\.", "_") -
replaceAll()换全部匹配项,replaceFirst()只换第一个 —— 这点和名字一致,但容易忽略 - 替换字符串里支持
$1、$2引用捕获组,但$本身要写成$$才能字面输出 - 性能上比
replace()低一截,正则编译+匹配开销明显,高频调用需留意
需要动态逻辑?别硬套 replace 系列
如果替换规则依赖上下文(比如“只替换第3个逗号”“大写字母前加空格”),String.replace* 都无能为力。这时候该切到 Pattern + Matcher。
本文档主要讲述的是Android数据格式解析对象JSON用法;JSON可以将Java对象转成json格式的字符串,可以将json字符串转换成Java。比XML更轻量级,Json使用起来比较轻便和简单。JSON数据格式,在Android中被广泛运用于客户端和服务器通信,在网络数据传输与解析时非常方便。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
立即学习“Java免费学习笔记(深入)”;
- 用
Matcher.appendReplacement()和appendTail()手动控制每次替换逻辑 - 可读性下降,但灵活性拉满:能计数、能跳过、能查前后字符、能调外部函数
- 示例:只替换偶数位置的
"x":Pattern.compile("x").matcher(s).find()循环中判断索引再决定是否appendReplacement - 注意
Matcher不是线程安全的,别在多线程里共享实例
真正难的不是选哪个函数,而是分清“我要换的是字面值,还是模式”。写完记得检查:传进去的字符串里有没有无意触发正则的字符;替换后有没有意外多删或多加;还有,别忘了字符串不可变——所有操作都得接返回值。









