452. Java 正则表达式 - 文本替换

0 阅读2分钟

452. Java 正则表达式 - 文本替换

在正则表达式处理中,文本替换 是非常常见的操作。Java 提供了多种方式完成替换,从简单的替换到更灵活的逐步替换。


1️⃣ replaceFirst()replaceAll()

功能:

  • replaceFirst():只替换匹配到的 第一个 子串
  • replaceAll():替换匹配到的 所有 子串

示例 1:替换单词 "dog""cat"

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class ReplaceDemo {

    private static String REGEX = "dog";
    private static String INPUT = "The dog says meow. All dogs say meow.";
    private static String REPLACE = "cat";

    public static void main(String[] args) {
        Pattern p = Pattern.compile(REGEX);
        Matcher m = p.matcher(INPUT);

        // 替换所有匹配
        INPUT = m.replaceAll(REPLACE);
        System.out.println(INPUT);
    }
}

输出结果:

The cat says meow. All cats say meow.

💡 说明

  • "dog" 被替换为 "cat"
  • 如果只想替换 第一个匹配,调用 replaceFirst(REPLACE) 即可。

示例 2:使用正则表达式替换

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class ReplaceDemo2 {

    private static String REGEX = "a*b";
    private static String INPUT = "aabfooaabfooabfoob";
    private static String REPLACE = "-";

    public static void main(String[] args) {
        Pattern p = Pattern.compile(REGEX);
        Matcher m = p.matcher(INPUT);

        INPUT = m.replaceAll(REPLACE);
        System.out.println(INPUT);
    }
}

输出结果:

-foo-foo-foo-

💡 说明

  • a*b 匹配 零个或多个 a 后跟一个 b 的模式
  • 可以看到复杂模式同样可以直接替换

2️⃣ appendReplacement()appendTail()

功能:

  • 提供 更灵活的替换控制,可逐个处理匹配
  • replaceAll() 效果相同,但可在替换过程中进行逻辑处理

示例:

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class RegexDemo {

    private static String REGEX = "a*b";
    private static String INPUT = "aabfooaabfooabfoob";
    private static String REPLACE = "-";

    public static void main(String[] args) {
        Pattern p = Pattern.compile(REGEX);
        Matcher m = p.matcher(INPUT);

        StringBuffer sb = new StringBuffer();
        while (m.find()) {
            // 逐个替换匹配
            m.appendReplacement(sb, REPLACE);
        }
        // 将剩余文本追加到 sb
        m.appendTail(sb);

        System.out.println(sb.toString());
    }
}

输出结果:

-foo-foo-foo-

💡 说明

  • appendReplacement 可以在每次匹配时 动态生成替换内容
  • appendTail 用于 追加最后剩余的文本

3️⃣ String 类中的替换方法

Java String 类提供了和 Matcher 类等效的方法,使用更简单:

方法功能
replaceFirst(String regex, String replacement)替换第一个匹配子串
replaceAll(String regex, String replacement)替换所有匹配子串

示例:

String input = "aabfooaabfooabfoob";
String result = input.replaceAll("a*b", "-");
System.out.println(result);  // 输出: -foo-foo-foo-

💡 说明

  • 内部实现原理与 Pattern.compile(regex).matcher(str).replaceAll() 相同
  • 适合快速处理简单替换场景

✅ 小结

  1. replaceFirst() / replaceAll()快速替换,支持正则表达式
  2. appendReplacement() / appendTail()灵活控制每个匹配,可在替换过程中加入逻辑
  3. String.replaceFirst() / String.replaceAll()方便快捷,无需创建 Pattern / Matcher