杰瑞科技汇

java 正则表达式 replace

核心方法概览

方法 所属类 功能 示例
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 对象上调用,非常方便。

java 正则表达式 replace-图1
(图片来源网络,侵删)

语法

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:使用捕获组进行格式化

java 正则表达式 replace-图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 类。

java 正则表达式 replace-图3
(图片来源网络,侵删)

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 中正则表达式的替换技巧!

分享:
扫描分享到社交APP
上一篇
下一篇