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()相同 - 适合快速处理简单替换场景
✅ 小结
replaceFirst()/replaceAll()→ 快速替换,支持正则表达式appendReplacement()/appendTail()→ 灵活控制每个匹配,可在替换过程中加入逻辑String.replaceFirst()/String.replaceAll()→ 方便快捷,无需创建Pattern/Matcher