0Pricing
Java Academy · 课时

使用正则替换

replaceAll 与反向引用

使用正则替换 是 CoddyKit 上的免费 Java Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Java Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Java Academy 课程共包含 4 节课。

使用正则表达式进行替换

正则表达式不仅可以用于搜索,还可以转换文本。replaceAll 会将每个匹配项替换为替换字符串。

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

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("\\d+").matcher("a1b22c333");
        System.out.println(m.replaceAll("#"));
    }
}

String.replaceAll 快捷方式

String.replaceAll(regex, replacement) 是一种方便的单行写法,会在内部编译模式。

public class Main {
    public static void main(String[] args) {
        String cleaned = "hello   world  again".replaceAll("\\s+", " ");
        System.out.println(cleaned);
    }
}

replaceFirst

replaceFirst 只替换第一个匹配项,后续匹配项保持不变。

public class Main {
    public static void main(String[] args) {
        String s = "cat cat cat".replaceFirst("cat", "dog");
        System.out.println(s);
    }
}

替换字符串中的组引用

在替换字符串中,$1、$2 等会插入相应组捕获的文本。这样可以重新排列或重新格式化匹配到的内容。

public class Main {
    public static void main(String[] args) {
        String iso = "30/05/2026".replaceAll("(\\d{2})/(\\d{2})/(\\d{4})", "$3-$2-$1");
        System.out.println(iso);
    }
}

命名组引用

您也可以在替换字符串中使用 ${name} 引用命名组。

public class Main {
    public static void main(String[] args) {
        String r = "alice@example.com"
            .replaceAll("(?<user>\\w+)@(?<host>[\\w.]+)", "${user} at ${host}");
        System.out.println(r);
    }
}

转义美元符号和反斜杠

由于 $ 和 \ 在替换字符串中具有特殊含义,因此要将字面量美元符号写成 \$。Matcher.quoteReplacement 可以替您完成转义。

import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        String price = "100".replaceAll("\\d+", Matcher.quoteReplacement("$100"));
        System.out.println(price);
    }
}

使用 replaceAll 函数计算替换内容

从 Java 9 开始,Matcher.replaceAll 可以接受一个函数,让您根据匹配项计算每次替换的内容。

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

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("\\d+").matcher("a1 b2 c3");
        String out = m.replaceAll(mr -> String.valueOf(Integer.parseInt(mr.group()) * 10));
        System.out.println(out);
    }
}

将匹配到的单词转为大写

当替换内容取决于匹配到的文本时,函数形式尤其有用,例如将每个单词转换为大写。

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

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("\\b\\w").matcher("hello there world");
        String title = m.replaceAll(mr -> mr.group().toUpperCase());
        System.out.println(title);
    }
}

appendReplacement 和 appendTail

如需完全控制,可以循环调用 find,先通过 appendReplacement 构建输出,最后调用 appendTail。这是经典的底层技术。

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

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("\\d+").matcher("a1b2");
        StringBuilder sb = new StringBuilder();
        while (m.find()) {
            m.appendReplacement(sb, "[" + m.group() + "]");
        }
        m.appendTail(sb);
        System.out.println(sb);
    }
}

模式中的反向引用

模式中的反向引用(\1)会匹配重复的文本,适合在替换过程中合并重复的单词。

public class Main {
    public static void main(String[] args) {
        String fixed = "the the end end".replaceAll("\\b(\\w+) \\1\\b", "$1");
        System.out.println(fixed);
    }
}

去除不需要的字符

一种常见用途是清理输入:将允许集合之外的所有内容替换为空字符串。

public class Main {
    public static void main(String[] args) {
        String digits = "(555) 123-4567".replaceAll("[^0-9]", "");
        System.out.println(digits);
    }
}

快速检查

在 replaceAll 的替换字符串中,$2 表示什么?

回顾

您已经学习了如何使用正则表达式转换文本:

  • replaceAll 和 replaceFirst 会替换匹配项;String 提供了快捷方式。
  • $1 / ${name} 会在替换字符串中插入捕获组;可以将字面量 $ 写成 \$,或使用 quoteReplacement 进行转义。
  • replaceAll 的函数形式会根据每个匹配项计算替换内容。
  • appendReplacement + appendTail 提供完全手动的控制。

常见问题解答

「使用正则替换」课时是免费的吗?

是的 — 「使用正则替换」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Java Academy 课程的其余内容,请升级到 CoddyKit PRO。 Java Academy 课程共包含 4 节课。

「使用正则替换」这节课中我会学到什么?

replaceAll 与反向引用 你通过在浏览器中直接运行的动手代码来练习 Java Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Java Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Java Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「使用正则替换」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Java Academy 课中编写并运行代码吗?

能。每节 Java Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 编译正则表达式
  2. 查找与匹配
  3. 捕获组
  4. 使用正则替换
← 返回 Java Academy