replace不支持正则,replaceall支持正则;replace按字面量匹配,replaceall经pattern.compile解析正则;replacefirst同replaceall但仅替换首个匹配项;固定字符串用replace,模式匹配用replaceall。

replace 不支持正则,replaceAll 支持正则——这是最核心的区别。很多开发者误以为两者只是“替换全部”和“替换一个”的差别,其实关键在于底层处理机制不同:replace 操作的是字面量字符串,replaceAll 走的是正则引擎。
replace:按字面值精确匹配,不识别正则元字符
replace 方法(包括 replace(CharSequence target, CharSequence replacement))把第一个参数当作纯文本处理,不做任何正则解析。哪怕你传入 "\d"、"." 或 "[a-z]+",它都只当普通字符去查找。
-
"a.b".replace(".", "x")→"axb"(点号被当作字面小数点) -
"123".replace("\d", "X")→"123"("\d"是两个字符,原串中没有这个子串,替换不生效) - 若想替换所有数字,用 replace 是做不到的,必须逐个枚举或循环处理
replaceAll:走 Pattern.compile,支持完整正则语法
replaceAll 的第一个参数会被 Java 当作正则表达式编译(等价于 Pattern.compile(regex).matcher(input).replaceAll(replacement)),因此支持分组、量词、字符类、边界符等所有正则特性。
-
"a.b".replaceAll(".", "x")→"xxx"(点号是正则通配符,匹配任意字符) -
"123abc456".replaceAll("\d", "N")→"NNNabcNNN"(\d正确匹配数字) - 注意:反斜杠需双写,因为 Java 字符串本身要转义一次,正则引擎还要再解析一次
还有一个常被忽略的 replaceFirst:只换第一个匹配项,但同样走正则
它的行为和 replaceAll 一致,只是只替换首次匹配。例如:
-
"aaabbbccc".replaceFirst("b+", "X")→"aaXccc" -
"hello world".replaceFirst("\s+\w+", " [REDACTED]")→"hello [REDACTED]"
安全建议:该用哪个?
选 replace 当且仅当你确定要替换的是**固定字符串**,比如统一修正某个拼写错误、替换某个配置占位符(如 "${host}");其余涉及模式匹配的场景,一律用 replaceAll(或 replaceFirst)。如果原始字符串含正则元字符(如 .、*、?、[ 等),又想按字面替换,可借助 Pattern.quote() 包装:
-
"a.b.c".replaceAll(Pattern.quote("."), "-")→"a-b-c" - 避免手动写
"\.",尤其面对动态内容时更可靠











