核心方法:String.replaceAll()
replaceAll() 是 java.lang.String 类的一个方法,它使用给定的正则表达式来替换字符串中所有匹配的子串。

方法签名
public String replaceAll(String regex, String replacement)
参数说明
regex: 正则表达式,这是一个字符串,但它被解释为一个正则表达式模式,而不是一个普通的字面字符串,这是它与String.replace()方法的最大区别。replacement: 替换字符串,这是一个普通的字符串,用于替换所有匹配到的内容,但它可以使用特殊引用来引用正则表达式中的捕获组。
返回值
一个新的字符串,其中所有匹配正则表达式 regex 的子串都被 replacement 字符串替换。
replaceAll() vs replace() 的关键区别
这是一个非常常见的混淆点,理解它们的区别至关重要。
| 特性 | replaceAll(String regex, String replacement) |
replace(CharSequence target, CharSequence replacement) |
|---|---|---|
| 第一个参数 | 正则表达式 | 普通字符串 |
| 功能 | 根据模式匹配进行替换 | 根据精确的字符序列匹配进行替换 |
| 示例 | str.replaceAll("\\d", "#") (替换所有数字为 ) |
str.replace("123", "#") (只替换精确的 "123" 为 ) |
| 转义需求 | 正则表达式中的特殊字符(如 \)需要用 \ 转义。 |
普通字符串中的特殊字符(如 \)不需要转义,除非它们在 replacement 中有特殊含义。 |
代码示例
让我们通过一系列例子来彻底理解 replaceAll() 的工作方式。
示例 1:简单的字符替换
目标:将字符串中的所有数字替换为 。

public class RegexReplaceExample {
public static void main(String[] args) {
String text = "我的电话是138-1234-5678,他的电话是139-8765-4321。";
// \d 是正则表达式,表示任意一个数字字符 [0-9]
// 在 Java 字符串中,反斜杠 \ 是一个转义字符,所以我们需要写成 "\\d"
String result = text.replaceAll("\\d", "#");
System.out.println("原始字符串: " + text);
System.out.println("替换后字符串: " + result);
}
}
输出:
原始字符串: 我的电话是138-1234-5678,他的电话是139-8765-4321。
替换后字符串: 我的电话是###-####-####,他的电话是###-####-####。
关键点:
\d是正则表达式中的元字符,代表一个数字。- 在 Java 的字符串字面量中,要表示一个字面上的反斜杠
\,必须写成\\。\\d才能被正确解析为正则表达式\d。
示例 2:替换更复杂的模式
目标:将所有电话号码(格式为 XXX-XXXX-XXXX)替换为 [已隐藏]。
public class RegexReplaceExample2 {
public static void main(String[] args) {
String text = "紧急联系人: 张三 138-1234-5678,李四 139-8765-4321。";
// \d{3} 表示正好3个数字字符
// - 是一个普通字符,需要匹配它本身
// \d{4} 表示正好4个数字字符
String regex = "\\d{3}-\\d{4}-\\d{4}";
String replacement = "[已隐藏]";
String result = text.replaceAll(regex, replacement);
System.out.println("原始字符串: " + text);
System.out.println("替换后字符串: " + result);
}
}
输出:

原始字符串: 紧急联系人: 张三 138-1234-5678,李四 139-8765-4321。
替换后字符串: 紧急联系人: 张三 [已隐藏],李四 [已隐藏]。
示例 3:使用捕获组
这是 replaceAll() 最强大的功能之一,你可以在正则表达式中使用括号 创建捕获组,然后在替换字符串中通过 $数字 的形式引用它们。
目标:将 "word1 word2 word3" 这样的格式,转换为 "word3-word2-word1"(即单词顺序反转)。
public class RegexReplaceExample3 {
public static void main(String[] args) {
String text = "hello world java regex";
// (\w+) 匹配一个或多个单词字符,并创建一个捕获组
// 空格 \s+ 匹配一个或多个空白字符
// 整个模式匹配 "单词 空格 单词 空格 单词"
// 我们捕获了三个单词: ("hello"), ("world"), ("java")
String regex = "(\\w+)\\s+(\\w+)\\s+(\\w+)";
// $3 引用第三个捕获组
// $2 引用第二个捕获组
// $1 引用第一个捕获组
String replacement = "$3-$2-$1";
String result = text.replaceAll(regex, replacement);
System.out.println("原始字符串: " + text);
System.out.println("替换后字符串: " + result);
}
}
输出:
原始字符串: hello world java regex
替换后字符串: java-world-hello
注意: 上面的例子只适用于恰好三个单词的字符串,更通用的反转方法需要结合其他技巧,但这很好地展示了捕获组的引用。
示例 4:在替换字符串中使用特殊字符
在 replacement 字符串中有特殊含义,用于引用捕获组,如果你想在替换结果中包含一个字面上的 字符,你需要用反斜杠 \ 对其进行转义。
目标:将 "price: 100" 中的价格提取出来,并格式化为 "价格是 $100.00"。
public class RegexReplaceExample4 {
public static void main(String[] args) {
String text = "The price is 100 dollars.";
// 捕获 "100"
String regex = "price is (\\d+)";
// $1 引用捕获的数字
// \$ 用来在结果中插入一个字面上的 '$' 符号
String replacement = "价格是 \\$$1.00";
String result = text.replaceAll(regex, replacement);
System.out.println("原始字符串: " + text);
System.out.println("替换后字符串: " + result);
}
}
输出:
原始字符串: The price is 100 dollars.
替换后字符串: 价格是 $100.00 dollars.
(注意:这个例子替换了整个匹配部分,"dollars" 仍然存在,更精确的替换需要更复杂的正则表达式。)
常见错误和注意事项
错误 1:忘记转义正则表达式中的反斜杠
错误代码:
// 错误!
String path = "C:\\Users\\Guest";
// 想要把所有的反斜杠替换成正斜杠
String result = path.replaceAll("\", "/"); // 编译错误!
原因:
- Java 字符串中的
"\"是一个转义序列,不是一个有效的字符。"\\"才代表一个字面上的反斜杠字符\。 replaceAll的第一个参数是正则表达式,而正则表达式中的\也是个特殊字符,需要用另一个\来转义。
正确代码:
// 正确!
String path = "C:\\Users\\Guest";
// 要匹配一个字面上的反斜杠,在正则表达式中需要写成 "\\"
// 在Java字符串中,需要写成 "\\\\"
String result = path.replaceAll("\\\\", "/");
System.out.println(result); // 输出: C:/Users/Guest
错误 2:在 replacement 中错误地使用
错误代码:
String text = "ID: 12345, Name: John Doe";
// 想要得到 "ID=12345"
String result = text.replaceAll("ID: (\\d+)", "ID=$1"); // 错误
原因:
这里的错误是概念性的。$1 是用来引用正则表达式中的捕获组的
