Scala与Java中replace、replaceAll、replaceAllLiterally的区别是什么
Java与Scala字符串替换核心方法对比
前置说明:replaceAllLiterally是Scala标准库对String类扩展的独有API,Java原生String没有提供该方法。
1. 单个方法规则说明
1.1 Java 字符串替换方法
replace(CharSequence target, CharSequence replacement)- 参数处理:两个入参均为纯字面量字符串,不会做任何正则相关的特殊解析
- 正则支持:完全不支持正则
- 行为:替换所有和target完全匹配的子串为replacement
replaceAll(String regex, String replacement)- 参数处理:第一个入参会被解析为正则表达式,第二个入参中的
$符号会被识别为正则分组反向引用标记 - 正则支持:完全支持正则规则
- 行为:替换所有符合正则匹配规则的子串为处理后的replacement
- 参数处理:第一个入参会被解析为正则表达式,第二个入参中的
1.2 Scala 字符串替换方法
Scala的String本身封装的是Java String,前两个方法底层默认调用Java的同名实现,行为完全一致,额外扩展了replaceAllLiterally方法:
replace(target: CharSequence, replacement: CharSequence):和Java行为完全一致replaceAll(regex: String, replacement: String):和Java行为完全一致replaceAllLiterally(literal: String, replacement: String)- 参数处理:两个入参均按纯字面量处理,底层自动对入参做正则转义封装,完全屏蔽正则解析逻辑
- 正则支持:不支持正则,所有特殊字符均按本身含义匹配
- 行为:替换所有和literal完全匹配的子串为replacement,不需要手动处理正则转义
2. 核心差异对比
我们以原字符串"a.b.c$1",目标是把所有.替换为-为例,展示不同方法的表现差异:
| 方法 | 调用代码 | 输出结果 | 说明 |
|---|---|---|---|
Java/Scala replace | str.replace(".", "-") | a-b-c$1 | 正常匹配.字面量,输出符合预期 |
Java/Scala replaceAll | str.replaceAll(".", "-") | -------- | .被识别为正则通配符,匹配所有字符,全部替换为-,不符合预期 |
Java/Scala replaceAll | str.replaceAll("\\.", "-") | a-b-c$1 | 对.做正则转义后,输出符合预期 |
Scala replaceAllLiterally | str.replaceAllLiterally(".", "-") | a-b-c$1 | 不需要手动转义,自动把.当成字面量匹配,输出符合预期 |
常见误区:很多开发者误以为
replace仅替换第一个匹配项,实际上上述三个方法都是替换所有符合规则的匹配项,差异仅在匹配规则是否支持正则,和替换次数无关。
3. 适用场景推荐
- 仅需要普通字符串全量替换,不需要正则能力:优先使用
replace,Java和Scala通用,性能更高,不需要处理转义逻辑 - 需要使用正则规则做模糊匹配替换(比如替换所有数字、去除首尾特殊格式字符等):使用
replaceAll,注意对正则特殊字符(. * + ? $ ^ () []等)做转义处理 - Scala环境下,要替换的目标字符串本身包含大量正则特殊字符,不想额外处理转义逻辑:直接使用
replaceAllLiterally,代码可读性更高,也能避免转义遗漏导致的bug
内容的提问来源于stack exchange,提问作者Hola Hola
相关产品推荐
相关产品推荐

