450. Java 正则表达式 - Matcher 类详解
文章目录
- 450. Java 正则表达式 - Matcher 类详解
- 1️⃣ 索引方法(Index Methods)
- 示例:
- 2️⃣ 查找方法(Study Methods)
- 示例:
- 3️⃣ 替换方法(Replacement Methods)
- 示例 1:`replaceAll`
- 示例 2:`appendReplacement` + `appendTail`
- 示例 3:`quoteReplacement`
- 🔹 小结
450. Java 正则表达式 - Matcher 类详解
Matcher类是 Java 正则表达式中非常核心的类,它提供了定位、匹配和替换等丰富功能。
1️⃣ 索引方法(Index Methods)
这些方法帮助你找到匹配内容在字符串中的起始位置和结束位置。
| 方法 | 说明 |
|---|---|
int start() | 返回上一次匹配的起始索引 |
int start(int group) | 返回指定捕获组的起始索引 |
int end() | 返回上一次匹配的结束索引(即匹配的最后一个字符的下一个位置) |
int end(int group) | 返回指定捕获组的结束索引 |
示例:
importjava.util.regex.*;publicclassMatcherIndexDemo{publicstaticvoidmain(String[]args){Stringinput="cat dog cat";Patternpattern=Pattern.compile("(cat)");Matchermatcher=pattern.matcher(input);while(matcher.find()){System.out.println("Found '"+matcher.group(1)+"' from "+matcher.start(1)+" to "+matcher.end(1));}}}输出:
Found'cat'from0to3Found'cat'from8to11💡 说明:
matcher.group(1)对应第一个捕获组(cat)start()和end()返回精确的索引位置,方便提取或替换匹配内容
2️⃣ 查找方法(Study Methods)
这些方法判断是否存在匹配,并可以控制匹配范围。
| 方法 | 说明 |
|---|---|
boolean lookingAt() | 从输入开头开始匹配,部分匹配成功即返回true |
boolean find() | 查找下一个匹配 |
boolean find(int start) | 从指定索引start开始查找下一个匹配 |
boolean matches() | 匹配整个输入,完全匹配才返回true |
示例:
Patternpattern=Pattern.compile("\\d+");Matchermatcher=pattern.matcher("123abc456");// lookingAtSystem.out.println(matcher.lookingAt());// true,开头是数字// findwhile(matcher.find()){System.out.println("Found: "+matcher.group()+" at "+matcher.start()+"-"+matcher.end());}// matchesMatchermatcher2=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
Stringinput="cat dog cat";Patternpattern=Pattern.compile("cat");Matchermatcher=pattern.matcher(input);Stringresult=matcher.replaceAll("lion");System.out.println(result);// 输出 lion dog lion示例 2:appendReplacement+appendTail
Stringinput="one:two:three";Patternpattern=Pattern.compile(":");Matchermatcher=pattern.matcher(input);StringBuffersb=newStringBuffer();while(matcher.find()){matcher.appendReplacement(sb,"|");// 替换每个冒号为 |}matcher.appendTail(sb);// 添加剩余字符串System.out.println(sb.toString());// 输出 one|two|three示例 3:quoteReplacement
Stringinput="price: $100";Patternpattern=Pattern.compile("\\$\\d+");Matchermatcher=pattern.matcher(input);// 使用字面量替换,避免 $ 被当作正则组Stringreplacement=Matcher.quoteReplacement("$200");Stringresult=matcher.replaceAll(replacement);System.out.println(result);// 输出 price: $200💡 说明:
quoteReplacement很重要,避免$被当作分组引用appendReplacement+appendTail可用于复杂替换逻辑
🔹 小结
- 索引方法:快速定位匹配位置
- 查找方法:灵活判断匹配,支持部分匹配和整体匹配
- 替换方法:替换字符串、循环替换、字面量替换,文本处理利器
✅ 小技巧:
replaceAll适合简单替换appendReplacement + appendTail适合复杂替换和按条件替换
