Java-Matcher类
Matcher
类是Java正则表达式API的核心组件之一(位于java.util.regex
包),用于执行复杂的字符串匹配操作。它与Pattern
类配合使用,提供查找、替换、分组提取等功能。
1. Matcher类的作用
-
对输入字符串执行匹配操作(查找、替换等)
-
支持分组提取(通过
()
捕获的子表达式) -
提供位置信息(匹配的起始和结束索引)
-
支持多次匹配和重置
2. 创建Matcher对象
Matcher对象必须通过Pattern.matcher()
方法创建,不能直接实例化。
Pattern pattern = Pattern.compile("\\d+"); // 编译正则表达式
Matcher matcher = pattern.matcher("A1B2C3"); // 创建Matcher对象
3. 核心方法详解
3.1 匹配检查方法
方法 | 说明 |
---|---|
boolean matches() | 完全匹配:检查整个字符串是否匹配正则表达式 |
boolean lookingAt() | 部分匹配:检查字符串开头是否匹配 |
boolean find() | 查找子串:查找字符串中下一个匹配的子串 |
boolean find(int start) | 从指定位置开始查找 |
示例:
Matcher matcher = Pattern.compile("Java").matcher("Java is fun");System.out.println(matcher.matches()); // false(不完全匹配)
System.out.println(matcher.lookingAt()); // true(开头匹配)
System.out.println(matcher.find()); // true(找到"Java")
3.2 获取匹配结果
方法 | 说明 |
---|---|
String group() | 返回当前匹配的子串 |
String group(int group) | 返回指定分组的子串 |
int groupCount() | 返回分组数量(不包括group(0)) |
int start() | 返回当前匹配的起始索引 |
int end() | 返回当前匹配的结束索引+1 |
示例(分组提取):
Pattern pattern = Pattern.compile("(\\d{3})-(\\d{4})");
Matcher matcher = pattern.matcher("电话: 123-4567");if (matcher.find()) {System.out.println("完整匹配: " + matcher.group(0)); // "123-4567"System.out.println("区号: " + matcher.group(1)); // "123"System.out.println("号码: " + matcher.group(2)); // "4567"System.out.println("分组数量: " + matcher.groupCount()); // 2
}
3.3 替换操作
方法 | 说明 |
---|---|
String replaceAll(String replacement) | 替换所有匹配的子串 |
String replaceFirst(String replacement) | 替换第一个匹配的子串 |
Matcher appendReplacement(StringBuffer sb, String replacement) | 渐进式替换(需配合appendTail() ) |
示例:
Matcher matcher = Pattern.compile("Java").matcher("Java is cool. Java is powerful.");// 替换所有匹配
System.out.println(matcher.replaceAll("Python"));
// 输出: "Python is cool. Python is powerful."// 渐进式替换
StringBuffer sb = new StringBuffer();
while (matcher.find()) {matcher.appendReplacement(sb, "Python");
}
matcher.appendTail(sb);
System.out.println(sb.toString()); // 同上
3.4 重置与区域限制
方法 | 说明 |
---|---|
Matcher reset() | 重置匹配器(从头开始匹配) |
Matcher reset(CharSequence input) | 重置并更换输入字符串 |
Matcher region(int start, int end) | 限制匹配范围(左闭右开区间) |
示例:
Matcher matcher = Pattern.compile("\\d+").matcher("A1B2C3");matcher.region(2, 4); // 只匹配"B2"部分
while (matcher.find()) {System.out.println(matcher.group()); // 输出: "2"
}
4. 高级功能
4.1 命名分组(Java 7+)
通过(?<name>regex)
定义命名分组,通过group(String name)
访问。
Pattern pattern = Pattern.compile("(?<area>\\d{3})-(?<number>\\d{4})");
Matcher matcher = pattern.matcher("123-4567");if (matcher.find()) {System.out.println("区号: " + matcher.group("area")); // "123"System.out.println("号码: " + matcher.group("number")); // "4567"
}
4.2 非捕获分组
使用(?:regex)
表示非捕获分组(不占用分组编号)。
Pattern pattern = Pattern.compile("(?:Mr|Ms) (\\w+)");
Matcher matcher = pattern.matcher("Mr Smith");if (matcher.find()) {System.out.println(matcher.group(1)); // "Smith"(group(0)为"Mr Smith")
}
5. 性能优化建议
-
复用Matcher对象:
避免在循环中重复创建Matcher,优先调用reset()
。Pattern pattern = Pattern.compile("\\d+"); Matcher matcher = pattern.matcher("");for (String s : strings) {matcher.reset(s);while (matcher.find()) { ... } }
-
预编译正则表达式:
多次使用的正则表达式应编译为Pattern
对象。 -
合理使用区域限制:
通过region()
缩小匹配范围提升性能。
6. 完整示例
import java.util.regex.*;public class MatcherDemo {public static void main(String[] args) {// 1. 编译正则表达式Pattern pattern = Pattern.compile("(\\d{3})-(\\d{4})");// 2. 创建MatcherMatcher matcher = pattern.matcher("电话: 123-4567, 备用: 890-1234");// 3. 查找所有匹配while (matcher.find()) {System.out.println("完整匹配: " + matcher.group());System.out.println("区号: " + matcher.group(1));System.out.println("号码: " + matcher.group(2));}// 4. 替换操作String replaced = matcher.replaceAll("***-$2");System.out.println(replaced); // "电话: ***-4567, 备用: ***-1234"}
}
7. 总结
功能 | 关键方法 | 说明 |
---|---|---|
完全匹配 | matches() | 检查整个字符串是否匹配 |
部分匹配 | lookingAt() | 检查字符串开头是否匹配 |
查找子串 | find() | 遍历所有匹配的子串 |
分组提取 | group(int) / group(String) | 获取捕获组内容 |
替换操作 | replaceAll() / replaceFirst() | 替换匹配的子串 |
区域限制 | region() | 限定匹配范围 |
核心要点:
-
Matcher
必须通过Pattern.matcher()
创建。 -
find()
和matches()
的区别:前者查找子串,后者要求完全匹配。 -
分组编号从1开始,
group(0)
表示整个匹配。