replace()处理字面量字符串,replaceAll()接收正则表达式;前者不解析转义、性能高、适合固定文本替换,后者需注意双重转义、有编译开销且支持捕获组引用。
replace() 和 replaceAll() 的根本区别在哪
区别不在名字,而在参数类型和底层逻辑:
处理的是字面量字符串,
接收正则表达式。传错类型就会白替换——比如想删掉所有数字却写了
,结果一个都不动,因为
根本不解析转义,它只找字面等于
的子串。
常见错误现象:用
想实现通配替换(如空格变下划线、连续空白压缩),结果只换了一处;或误以为
能直接处理特殊字符,没加双反斜杠导致
。
:安全、快、适合固定文本替换
:灵活、有开销、必须确保
语法合法
若正则里要引用捕获组,
中得用
,不是
(后者是旧式写法,Java 不认)
什么时候该用 replace(),而不是 replaceAll()
当你要做的只是“把 A 换成 B”,且 A 是确定的字符串(哪怕含中文、emoji、制表符),就无脑用
。它不编译正则、不走
引擎,性能高,行为可预测。
典型使用场景:清理用户输入中的多余空格(但只换一次)、统一替换 API 返回里的字段名、把模板占位符
替成真实值。
立即学习
“
Java免费学习笔记(深入)
”;
Eclipse导入Android或其他的JAVA项目的正确方法 WORD版
本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
下载
想把所有半角空格换成全角空格?→
想把
统一改成
?→
想删掉字符串开头的
(如
→
),且只删一次?→
更准,但若确定只有开头有,
会误杀中间的 v
replaceAll() 容易踩的转义坑
Java 字符串本身就要转义一次,正则引擎还要再转义一次,所以匹配一个反斜杠得写四个:
。这不是 Java 特色,是双层解析的必然结果。
常见错误现象:想替换点号
,写了
,结果整串变成一长串短横——因为
在正则是通配符;或者想替换括号,没加
,抛出
。
匹配字面量
→ 用
(正则中点需转义,Java 字符串再套一层)
匹配字面量
→ 用
(否则被当成行尾锚点)
匹配字面量
→ 用
(正则要
,Java 字符串写成
)
不确定要不要转义?查 Java 正则元字符表,或改用
包裹字面量部分
性能与兼容性:别在循环里滥用 replaceAll()
每次调用都会编译正则(除非 JVM 做了缓存,但不保证)。如果在高频路径(如日志格式化、HTTP 请求头处理)里反复调用同一个正则,性能损耗明显,且可能触发 JIT 优化抑制。
Android 上更敏感:低版本 ART 对正则编译开销更重;某些国产 ROM 还会额外拦截正则初始化逻辑,引发不可预知延迟。
高频固定正则?提前编译:用
存为 static final,再调
只是简单字符替换?坚持用
,它比
快 3–5 倍(JMH 测过)
Java 9+ 可考虑
或
配合
做轻量清洗,避免引入正则
替换成什么不难,难的是清楚自己到底在跟字面量打交道,还是在跟正则引擎谈判。很多 bug 的根源,是把
当成简化版
,或者反过来,拿正则去硬刚纯文本场景。
replace()replaceAll()str.replace("\d", "")replace()"\d"replace()replaceAll()PatternSyntaxExceptionreplace(CharSequence target, CharSequence replacement)replaceAll(String regex, String replacement)regexreplacement$1replace()Pattern${id}str.replace(" ", " ")"error:404""ERR-404"str.replace("error:", "ERR-")"v""v1.2.0""1.2.0"str.replaceFirst("^v", "")replace("v", "")"\\\".str.replaceAll(".", "-").\PatternSyntaxException: Unclosed group near index 1."\."$"\$""\\\""\\""\\\"Pattern.quote(str)replaceAll()Pattern.compile("...")pattern.matcher(str).replaceAll(...)replace()replaceAll()String.strip()String.isBlank()replace()replace()replaceAll()