文章目录
- [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)
- [示例 1:`replaceAll`](#示例 1:
- [🔹 小结](#🔹 小结)
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适合复杂替换和按条件替换