Java中Matcher类怎么用_Java正则匹配流程解析

Matcher类是Java正则匹配核心工具,需通过Pattern.matcher()获取;matches()要求全串匹配,lookingAt()要求开头匹配,find()查找任意位置子串;group()等方法需匹配成功后调用;replaceAll()、replaceFirst()用于替换,reset()可复用Matcher。

Matcher类是Java正则表达式匹配的核心工具,它不直接创建,而是通过Pattern对象的matcher()方法获得。真正执行匹配逻辑、提取结果、替换文本等操作,都依赖Matcher实例。

Matcher必须配合Pattern使用

Pattern负责编译正则表达式,Matcher负责在目标字符串上执行具体匹配动作。没有Pattern,就没有合法的Matcher:

  • 先用Pattern.compile("正则串")得到Pattern对象
  • 再调用pattern.matcher("待匹配文本")获取Matcher
  • Matcher本身不能脱离Pattern独立构造(无public构造方法)

常用匹配方法的区别:matches()、lookingAt()、find()

这三个方法都返回boolean,但行为完全不同,容易混淆:

  • matches():要求整个输入字符串**完全匹配**正则(相当于正则前后隐含^和$)
  • lookingAt():只要从**字符串开头**能匹配上一部分就返回true(不要求匹配到末尾)
  • find():在字符串中**查找任意位置的子串匹配**,可多次调用找下一个匹配项

例如对字符串"abc123def456"和正则"\d+":

  • matches() → false(整串不是纯数字)
  • lookingAt() → false(开头不是数字)
  • find() → true(找到"123"),再调一次返回true(找到"456")

获取匹配结果:group()、start()、end()、groupCount()

调用find()matches()成功后,才能安全调用这些方法:

  • group():返回本次匹配的完整子串
  • group(int i):返回第i个捕获组(括号内的子表达式)匹配的内容,索引从1开始
  • start() / end():返回匹配子串在原字符串中的起始/结束索引(end()是右开区间)
  • groupCount():返回正则中捕获组的数量(不包括整个表达式本身)

注意:如果未成功匹配就调用group(),会抛IllegalStateException

替换与遍历:replaceAll()、replaceFirst()、reset()

Matcher提供基于匹配结果的文本处理能力:

  • replaceAll("新串"):把所有匹配部分替换成指定字符串
  • replaceFirst("新串"):只替换第一个匹配项
  • reset():重置Matcher状态,可复用它匹配新字符串(避免重复创建对象)

例如:matcher.reset("新文本").find(),就能让同一个Matcher继续工作。