replaceall()需对正则元字符(. * + ? [ ] ( ) { } ^ $ |)双反斜杠转义,如".";推荐用pattern.quote()自动转义或直接用replace()避免正则解析。

Java 中 String.replaceAll() 是基于正则表达式的替换方法,直接传入特殊字符(如 .、*、+、?、[、]、(、)、{、}、^、$、、|)会触发正则匹配逻辑,导致替换失败或抛出异常。关键是要对这些字符做**正则转义**,或者改用不解析正则的 replace()。
哪些字符需要特别注意
以下字符在正则中有特殊含义,若想按字面意思替换,必须转义:
-
.匹配任意字符 → 要替换点号,得写成\. -
*表示零次或多次 → 替换星号需写成\* -
+表示一次或多次 → 替换加号需写成\+ -
?表示零次或一次 → 替换问号需写成\? -
[、]、(、)、{、}、^、$、|、同理,前面加双反斜杠\
正确写法:用双反斜杠转义
因为 Java 字符串本身也要处理反斜杠,所以正则中的一个 在字符串里要写成 \;而要表示“字面上的点号”,正则要求是 .,Java 字符串就得写成 "\.":
String s = "a.b*c+d?e";
String result = s.replaceAll("\.", "-") // 把 . 换成 -
.replaceAll("\*", "_") // 把 * 换成 _
.replaceAll("\+", "=") // 把 + 换成 =
.replaceAll("\?", "!"); // 把 ? 换成 !
// 结果:a-b_c=d!e
更简单的方法:用 Pattern.quote() 自动转义
如果要替换的字符不确定是否含正则元字符,或者想避免手动数反斜杠,可以用 Pattern.quote() 包裹原字符串,它会自动把所有特殊字符转为字面量:
import java.util.regex.Pattern; <p>String s = "file[2024].log"; String target = "[2024]"; String replacement = "(2024)"; String result = s.replaceAll(Pattern.quote(target), replacement); // 结果:file(2024).log</p>
这个方式安全、直观,适合动态内容或用户输入的待替换字符串。
别忘了还有 replace() —— 更轻量的选择
如果只是纯字符/字符串替换,不需要正则功能,直接用 String.replace(CharSequence, CharSequence) 更简单、高效,且不涉及正则:
-
replace()参数是普通字符串,不是正则,无需转义 - 支持替换子串(不止单个字符),例如
"a.b".replace(".", "-")→"a-b" - 底层是遍历匹配,性能略低于
replaceAll()的编译正则,但对简单场景足够快
多数日常替换(比如去空格、改分隔符、清理符号)用 replace() 就够了,不易出错。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











