450. Java 正则表达式 - Matcher 类详解

文章目录

  • [450. Java 正则表达式 - Matcher 类详解](#450. Java 正则表达式 - Matcher 类详解)
    • [1️⃣ 索引方法(Index Methods)](#1️⃣ 索引方法(Index Methods))
    • [2️⃣ 查找方法(Study Methods)](#2️⃣ 查找方法(Study Methods))
    • [3️⃣ 替换方法(Replacement Methods)](#3️⃣ 替换方法(Replacement Methods))
      • [示例 1:`replaceAll`](#示例 1:replaceAll)
      • [示例 2:`appendReplacement` + `appendTail`](#示例 2:appendReplacement + appendTail)
      • [示例 3:`quoteReplacement`](#示例 3:quoteReplacement)
    • [🔹 小结](#🔹 小结)

450. Java 正则表达式 - Matcher 类详解

Matcher 类是 Java 正则表达式中非常核心的类,它提供了 定位、匹配和替换 等丰富功能。


1️⃣ 索引方法(Index Methods)

这些方法帮助你找到匹配内容在字符串中的 起始位置和结束位置

方法 说明
int start() 返回上一次匹配的 起始索引
int start(int group) 返回指定捕获组的 起始索引
int end() 返回上一次匹配的 结束索引(即匹配的最后一个字符的下一个位置)
int end(int group) 返回指定捕获组的 结束索引

示例:

java 复制代码
import java.util.regex.*;

public class MatcherIndexDemo {
    public static void main(String[] args) {
        String input = "cat dog cat";
        Pattern pattern = Pattern.compile("(cat)");
        Matcher matcher = pattern.matcher(input);
        
        while (matcher.find()) {
            System.out.println("Found '" + matcher.group(1) + "' from " + matcher.start(1) + " to " + matcher.end(1));
        }
    }
}

输出:

java 复制代码
Found 'cat' from 0 to 3
Found 'cat' from 8 to 11

💡 说明:

  • matcher.group(1) 对应第一个捕获组 (cat)
  • start()end() 返回 精确的索引位置,方便提取或替换匹配内容

2️⃣ 查找方法(Study Methods)

这些方法判断 是否存在匹配,并可以控制匹配范围。

方法 说明
boolean lookingAt() 输入开头 开始匹配,部分匹配成功即返回 true
boolean find() 查找 下一个匹配
boolean find(int start) 从指定索引 start 开始查找 下一个匹配
boolean matches() 匹配 整个输入 ,完全匹配才返回 true

示例:

java 复制代码
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher("123abc456");

// lookingAt
System.out.println(matcher.lookingAt());  // true,开头是数字

// find
while(matcher.find()) {
    System.out.println("Found: " + matcher.group() + " at " + matcher.start() + "-" + matcher.end());
}

// matches
Matcher matcher2 = pattern.matcher("123");
System.out.println(matcher2.matches());  // true,整个字符串是数字

3️⃣ 替换方法(Replacement Methods)

Matcher 提供了丰富的方法 替换匹配内容,适合文本处理。

方法 说明
appendReplacement(StringBuffer sb, String replacement) 非终结替换,用于循环替换部分匹配
appendTail(StringBuilder sb) 终结替换,把剩余未匹配部分追加到结果
replaceAll(String replacement) 替换 所有匹配
replaceFirst(String replacement) 替换 第一个匹配
static quoteReplacement(String s) 将替换字符串转为 字面量字符串 ,避免 $\ 被误解

示例 1:replaceAll

java 复制代码
String input = "cat dog cat";
Pattern pattern = Pattern.compile("cat");
Matcher matcher = pattern.matcher(input);
String result = matcher.replaceAll("lion");
System.out.println(result); // 输出 lion dog lion

示例 2:appendReplacement + appendTail

java 复制代码
String input = "one:two:three";
Pattern pattern = Pattern.compile(":");
Matcher matcher = pattern.matcher(input);
StringBuffer sb = new StringBuffer();

while(matcher.find()) {
    matcher.appendReplacement(sb, "|"); // 替换每个冒号为 |
}
matcher.appendTail(sb); // 添加剩余字符串

System.out.println(sb.toString()); // 输出 one|two|three

示例 3:quoteReplacement

java 复制代码
String input = "price: $100";
Pattern pattern = Pattern.compile("\\$\\d+");
Matcher matcher = pattern.matcher(input);

// 使用字面量替换,避免 $ 被当作正则组
String replacement = Matcher.quoteReplacement("$200");
String result = matcher.replaceAll(replacement);

System.out.println(result); // 输出 price: $200

💡 说明:

  • quoteReplacement 很重要,避免 $ 被当作 分组引用
  • appendReplacement + appendTail 可用于 复杂替换逻辑

🔹 小结

  • 索引方法:快速定位匹配位置
  • 查找方法:灵活判断匹配,支持部分匹配和整体匹配
  • 替换方法:替换字符串、循环替换、字面量替换,文本处理利器

✅ 小技巧:

  • replaceAll 适合简单替换
  • appendReplacement + appendTail 适合复杂替换和按条件替换