跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

如何在Java中替换字符串内容_replace与replaceAll正则替换

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

相关文章