replaceAll 是 Java String 类中一个非常强大的方法,但它的名字有时会引起误解,它不仅仅是“替换所有匹配的子串”,其核心功能是“使用正则表达式进行替换”。

replaceAll(String regex, String replacement)
这是你问题的核心,它使用给定的正则表达式 regex 作为匹配模式,将字符串中所有匹配该模式的子串替换为 replacement 字符串。
语法
public String replaceAll(String regex, String replacement)
参数
regex: 一个正则表达式,用于匹配字符串中的部分,注意,这是一个正则表达式,不是普通的字符串。replacement: 用来替换匹配项的字符串。
返回值
一个新字符串,其中所有匹配正则表达式的子串都被替换。
replaceAll 的核心:正则表达式
replaceAll 的第一个参数是正则表达式,这既是它的强大之处,也是常见的陷阱。
示例 1:简单的字符串替换(看起来像普通字符串)
String str = "hello world, hello java";
String result = str.replaceAll("hello", "hi");
System.out.println(result); // 输出: hi world, hi java
在这个例子中,"hello" 是一个简单的正则表达式,它只匹配字面上的 "hello" 字符串,所以看起来和普通替换一样。

示例 2:使用正则表达式的特殊字符
问题来了,如果你想替换一个包含特殊字符(如 \ 等)的字符串怎么办?
String price = "The price is $100.50.";
// 错误示范:$ 在正则表达式中有特殊含义(行尾)
// String result = price.replaceAll("$", "USD "); // 会抛出异常或不符合预期
// 正确示范:需要对特殊字符进行转义
String result = price.replaceAll("\\$", "USD ");
System.out.println(result); // 输出: The price is USD 100.50.
关键点:在 Java 字符串中,一个反斜杠 \ 本身也需要转义,所以表示一个字面量的反斜杠需要写成 \\,要匹配一个 符号,正则表达式里需要写 \$,而在 Java 字符串中,你需要写成 \\$。
示例 3:更复杂的正则表达式替换
这是 replaceAll 真正强大的地方。
String log = "2025-10-27 10:00:00 INFO User logged in";
// 替换日期和时间部分为 [TIMESTAMP]
String result = log.replaceAll("\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}", "[TIMESTAMP]");
System.out.println(result); // 输出: [TIMESTAMP] INFO User logged in
// 替换所有连续的空白字符为单个空格
String messyText = "This is a test.";
String normalizedText = messyText.replaceAll("\\s+", " ");
System.out.println(normalizedText); // 输出: This is a test.
\d匹配任意数字。{4}表示前面的元素(\d)恰好出现 4 次。\s匹配任何空白字符(空格、制表符、换行等)。- 表示前面的元素(
\s)出现一次或多次。
replaceAll 的替代方法
很多时候,你并不需要正则表达式,只是想进行简单的字符串替换,这时,replaceAll 就不是最佳选择,因为:

- 性能开销:正则表达式引擎的解析和匹配比普通字符串遍历要慢。
- 转义麻烦:如上所述,特殊字符需要转义,代码容易出错。
这时,你应该考虑以下两个方法:
replace(char oldChar, char newChar)
用于替换所有出现的单个字符。
String str = "hello world";
String result = str.replace('l', 'z');
System.out.println(result); // 输出: hezzo worzd
replace(CharSequence target, CharSequence replacement)
这是最常用、最推荐的普通字符串替换方法,它替换所有出现的子串,不使用正则表达式。
String str = "hello world, hello java";
String result = str.replace("hello", "hi");
System.out.println(result); // 输出: hi world, hi java
// 替换特殊字符,无需转义
String price = "The price is $100.50.";
String result2 = price.replace("$", "USD ");
System.out.println(result2); // 输出: The price is USD 100.50.
CharSequence 是一个接口,String 和 StringBuilder 等都实现了它,所以你可以直接传入字符串。
replaceFirst(String regex, String replacement)
这是 replaceAll 的“表兄弟”,它只替换第一个匹配正则表达式的子串。
String str = "apple apple banana apple";
// 只替换第一个 "apple"
String result = str.replaceFirst("apple", "orange");
System.out.println(result); // 输出: orange apple banana apple
总结与对比
| 方法 | 是否使用正则表达式 | 替换次数 | 特点 | 适用场景 |
|---|---|---|---|---|
replaceAll(regex, replacement) |
是 | 所有 | 功能强大,但性能较低,特殊字符需转义 | 需要匹配复杂模式(如数字、空白、特定格式等)的替换 |
replace(target, replacement) |
否 | 所有 | 性能高,简单直接,无需转义 | 绝大多数情况下的首选,用于普通字符串或字符的替换 |
replaceFirst(regex, replacement) |
是 | 仅第一个 | 功能介于两者之间,只替换第一个匹配项 | 当你只想处理第一个匹配项,且匹配规则较复杂时 |
如何选择?
-
如果你只是想替换一个固定的字符串或字符:
- 首选
replace(),这是最安全、最高效的选择。
- 首选
-
如果你的替换规则很复杂,需要用到通配符(如匹配任意字符,
\d匹配数字等):- 使用
replaceAll(),请务必记住regex参数是正则表达式,并对特殊字符进行转义。
- 使用
-
如果你只想替换第一个匹配项,且规则很复杂:
- 使用
replaceFirst()。
- 使用
记住这个黄金法则:
能用
replace()就别用replaceAll()。
