使用正则替换
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 反馈 — 无需本地设置。