核心方法概览
| 方法 | 所属类 | 功能 | 示例 |
|---|---|---|---|
replaceAll(String regex, String replacement) |
java.lang.String |
将字符串中所有匹配正则表达式的子串替换为指定的 replacement 字符串。 |
"abc123abc".replaceAll("\\d", "x") |
replaceFirst(String regex, String replacement) |
java.lang.String |
将字符串中第一个匹配正则表达式的子串替换为指定的 replacement 字符串。 |
"abc123abc".replaceFirst("\\d", "x") |
appendReplacement(StringBuffer sb, String replacement) |
java.util.regex.Matcher |
在替换过程中,将匹配到的子串替换为 replacement,并将替换后的结果追加到 StringBuffer 中,这是更灵活的替换方式。 |
见下文高级用法 |
appendTail(StringBuffer sb) |
java.util.regex.Matcher |
在 appendReplacement 之后,将输入字符串的剩余部分追加到 StringBuffer 中。 |
见下文高级用法 |
String.replaceAll() 和 replaceFirst()
这是最简单、最常用的方法,它们直接在 String 对象上调用,非常方便。

语法
public String replaceAll(String regex, String replacement) public String replaceFirst(String regex, String replacement)
regex: 你要匹配的正则表达式模式。replacement: 用来替换匹配内容的字符串。
重要: 的特殊含义
在 replacement 字符串中, 有特殊的含义,它用于引用捕获组。
$0:表示整个匹配的字符串。$1:表示第一个捕获组 匹配的内容。$2:表示第二个捕获组,以此类推。
如果你想在替换字符串中直接使用 字符本身,你需要用 \\ 进行转义,即 \$。
示例
示例 1:简单的数字替换
String text = "我的电话是 138-1234-5678,备用电话是 159-8765-4321。";
// 将所有数字替换为 "X"
String result1 = text.replaceAll("\\d", "X");
System.out.println(result1);
// 输出: 我的电话是 XXX-XXXX-XXXX,备用电话是 XXX-XXXX-XXXX。
// 只替换第一个数字
String result2 = text.replaceFirst("\\d", "X");
System.out.println(result2);
// 输出: 我的电话是 X38-1234-5678,备用电话是 159-8765-4321。
示例 2:使用捕获组进行格式化

假设我们想将日期格式 YYYY-MM-DD 改为 DD/MM/YYYY。
String dateStr = "今天是 2025-10-27。";
// 正则表达式:捕获四位数年份,两位数月份,两位数日期
// (\\d{4}) 是第一个捕获组,(\\d{2}) 是第二个,(\\d{2}) 是第三个
String regex = "(\\d{4})-(\\d{2})-(\\d{2})";
// 替换字符串:使用 $3/$2/$1 来重新排列捕获组的内容
String replacement = "$3/$2/$1";
String newDateStr = dateStr.replaceAll(regex, replacement);
System.out.println(newDateStr);
// 输出: 今天是 27/10/2025。
示例 3:在替换字符串中使用 字符
如果我们想把 price: $100 中的 $100 替换为 [100元]。
String priceText = "The price is $100, and the discount is $20."; // 我们想匹配 "$100" 和 "$20" // 注意:$ 在正则里是特殊字符,需要转义为 \\$ // 我们用括号捕获数字部分 (\\d+) String regex = "\\$(\\d+)"; // 替换字符串:我们想保留美元符号,所以需要转义 \$,并用 $1 引用数字 String replacement = "[$1元]"; String result = priceText.replaceAll(regex, replacement); System.out.println(result); // 输出: The price is [100元], and the discount is [20元]。
Matcher.appendReplacement() 和 appendTail()
当你需要执行更复杂的替换逻辑时(在替换前对匹配的内容进行计算,或者替换时需要保留之前替换的结果),String.replaceAll() 就不够用了,这时你需要使用 java.util.regex 包中的 Matcher 类。

appendReplacement 的一个强大特性是,replacement 字符串中可以使用 $n 来引用捕获组,但它还支持一个更强大的特性:可以在替换字符串中嵌入 Java 代码的执行结果。
语法
// 1. 编译正则表达式,获取 Matcher 对象
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
// 2. 准备一个 StringBuffer 来存储结果
StringBuffer sb = new StringBuffer();
// 3. 循环查找并替换
while (matcher.find()) {
// 对匹配到的内容进行处理,然后替换
String replacement = ...; // 可以是动态计算的字符串
matcher.appendReplacement(sb, replacement);
}
// 4. 将剩余部分追加到结果中
matcher.appendTail(sb);
// 5. 获取最终结果
String result = sb.toString();
示例
示例:将匹配到的数字翻倍
假设我们有一个字符串 "Numbers: 10, 20, 30.",我们想把每个数字都乘以 2。
import java.util.regex.*;
String input = "Numbers: 10, 20, 30.";
String regex = "\\d+"; // 匹配一个或多个数字
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
// 获取匹配到的数字字符串
String matchedNumberStr = matcher.group();
// 将其转换为整数并翻倍
int doubledNumber = Integer.parseInt(matchedNumberStr) * 2;
// 将新的数字作为替换字符串
// 注意:这里不能直接用 $1,因为我们需要的是计算后的值
matcher.appendReplacement(sb, String.valueOf(doubledNumber));
}
// 将输入字符串中最后一个匹配项之后的部分追加到 sb 中
matcher.appendTail(sb);
String result = sb.toString();
System.out.println(result);
// 输出: Numbers: 20, 40, 60.
替换回调(Java 8+)
从 Java 8 开始,Matcher 类提供了一个更优雅的方式来处理动态替换:replaceFirst(Function<MatchResult, String>) 和 replaceAll(Function<MatchResult, String>)。
你不需要手动循环,而是传入一个函数式接口(Function),该接口接收一个 MatchResult 对象(它包含了匹配的所有信息,如整个匹配串、捕获组等),并返回一个用于替换的字符串。
示例:将匹配到的数字翻倍(Java 8+ 版本)
这个版本比手动使用 appendReplacement 更简洁、更易读。
import java.util.regex.*;
String input = "Numbers: 10, 20, 30.";
String regex = "\\d+";
// 使用 Function 作为替换逻辑
// MatchResult 包含了匹配到的所有信息
String result = Pattern.compile(regex).matcher(input)
.replaceAll(matchResult -> {
// 获取匹配到的字符串并转换为整数
int number = Integer.parseInt(matchResult.group());
// 返回翻倍后的字符串
return String.valueOf(number * 2);
});
System.out.println(result);
// 输出: Numbers: 20, 40, 60.
总结与选择
| 场景 | 推荐方法 | 原因 |
|---|---|---|
| 简单的全局或首次替换 | String.replaceAll() / replaceFirst() |
代码最简洁,一行搞定。 |
需要引用捕获组 ($n) |
String.replaceAll() / replaceFirst() |
直接支持 $n 语法,非常方便。 |
| 复杂的替换逻辑(如计算、调用方法) | Matcher.appendReplacement() + appendTail() |
提供了最大的灵活性,可以在循环中处理每个匹配项。 |
| 复杂的替换逻辑(Java 8+) | Matcher.replaceAll(Function) |
比 appendReplacement 更现代、更函数式,可读性更好。 |
希望这份详细的解释能帮助你掌握 Java 中正则表达式的替换技巧!
