JAVA正常表达式精通之路(mathes,find,lookingAt,group)

本文深入解析了Java中Pattern类的matcher方法和相关方法的使用技巧,包括matches、find、group、lookingAt及reset方法的特性与应用,通过实例展示了如何避免冲突并正确地获取匹配结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

小结:

public boolean matches()

尝试将整个区域与模式匹配。当前仅单整个区域是模式匹配的时候才会匹配

例如:

 Pattern p = Pattern.compile("\\d{3,5}");
          String s = "1237632";
          Matcher m = p.matcher(s);

对于整个模式而言,并非3到5个数字,所以会返回false,同时会截掉5个数字(按照多的来)

测试发现如果不断的做p.matcher(s)操作,还是返回true,经过分析认为

p.matcher执行多次等效于执行1次,且只会截一次

若不想受到matcher()截断影响,可以使用m.reset()方法恢复

m.find则从开始位置找子序列,找到返回true,通过group()方法返回匹配的子序列,且按照多的来,就是能5个不3个

测试发现会受到matcher()截断影响

lookingAt每次都从开始位置找,测试发现并没有收到matcher()截断影响

group()获取和整个模式匹配的内容

group(0):表示把模式拆分为多个组,而第0个组就是整个模式,所以等效于group

group(1):表示模式拆分为多个组,第二个模式组所匹配的内容

微笑以上结论结合了下文的实验测试所得,需要今后使用过程中不断完善!


下文参考:http://jingbo2759.blog.163.com/blog/static/983753152009811111619136/

直接看例子

public static void main(String[] args)
 {  
  Pattern p = Pattern.compile("\\d{3,5}");
  String s = "123-34345-234-00";
  Matcher m = p.matcher(s);//注意,matcher是全局匹配.这里明显是不匹配.但是,由于s里面的"123"和p是匹配的,所以他会将这三个数字去掉.下次调用匹配方法的时候,是将剩余的字符串来继续匹配
  p(m.matches());
  m.reset();//重新设置到最开始..如果这里没有这一步,下面的匹配将受到影响...
  p(m.find());//find方法是部分匹配..也就是说,只要找到有匹配的字符段就算匹配...但是,他和matcher方法一样也会将s里面已经匹配的字符去掉....这里匹配的是"123"
  p(m.find());//剩余的字符"-34345-234-00"继续匹配.匹配的是"34345"
  p(m.find());//剩余字符"-234-00"继续匹配.匹配的是"234"
  p(m.find());//剩余字"-00"符继续匹配.已经没有匹配的字符,所以这个方法不匹配.
  p(m.lookingAt());//lookingAt方法也是部分匹配,但是他都是从最开始进行匹配...所以每次都是匹配"123"
  p(m.lookingAt());
  p(m.lookingAt());
  p(m.lookingAt());
 }
 
 public static void p(Object o)
 {
  System.out.println(o);
 }

总结一下,matches方法和find方法会造成冲突,记得要调用reset方法...所以使用的时候要特别注意.

还有start和end方法..这两个方法写在find方法后..比如这样

p(m.find());
  p(m.start()+"-"+m.end());
  p(m.find());
  p(m.start()+"-"+m.end());
  p(m.find());
  p(m.start()+"-"+m.end());
  p(m.find());

start方法访问的是开始匹配的问题.注意,end方法返回的是最后匹配位置的下一个位置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值