码迷,mamicode.com
首页 > 编程语言 > 详细

Java 正则表达式里find()方法的使用

时间:2015-08-21 19:03:17      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
  public static void main (String[] args) {
    Pattern p = Pattern .compile ("\\d{3,5}");
    Matcher m = p.matcher("123-4567812-910-11");

     /*print (m.matches ());
    m.reset ();*/
    print (m.find ());//true
    print (m.group ());//123
    print (m.start ()+"-"+m.end ());//0-3: 1~-
    System.out.printf("换行--------------------\n");
    print (m.find ());//true
    print (m.group ());//45678
    print (m.start ()+"-"+m.end ());//4-9: 4~1
    System.out.printf("换行--------------------\n");
    print (m.find ());//true
    print (m.group ());//910
    print (m.start ()+"-"+m.end ());//12-15:9~-
    System.out.printf("换行--------------------\n");
    print (m.find ());//false
    System.out.printf("换行--------------------\n");
    System.out.println ();


    print (m.matches ());//false
    System.out.printf("换行\n");
    //m.reset ();
    print (m.find ());//true
    print (m.group ());//45678
    print (m.start ()+"-"+m.end ());//4-9
    System.out.printf("换行\n");
    print (m.find ());//true
    print (m.group ());//910
    print (m.start ()+"-"+m.end ());//12-15
    System.out.printf("换行\n");
    print (m.find ());//false
    System.out.printf("换行\n");
    print (m.find ());//false
    System.out.printf("换行\n");
    System.out.println ();

    print (m.matches ());//false
    System.out.printf("换行\n");
    m.reset ();
    print (m.find ());//true
    print (m.group ());//123
    print (m.start ()+"-"+m.end ());//0-3
    System.out.printf("换行\n");
    print (m.find ());//true
    print (m.group ());//45678
    print (m.start ()+"-"+m.end ());//4-9
    System.out.printf("换行\n");
    print (m.find ());//true
    print (m.group ());//910
    print (m.start ()+"-"+m.end ());//12-15
    System.out.printf("换行\n");
    print (m.find ());//false
    System.out.printf("换行\n");
    System.out.println ();

    print (m.lookingAt ());//true
    print (m.lookingAt ());//true
  }
  
   public static void print (Object o) {
    System.out.println (o);
  }
}
/*
*    对这个程序的解释:这个程序最大的难点在于find()方法的理解
*    在第一段程序中,find会一个字符一个字符的匹配,当检测到3的时候,发现已经有3个字符,那么这个find可以返回true了,但是没有完,它会继续检测,发现3的后面是-而不是数字,第一个find的结束,所以在group这个里输出123,从0到3(注意下标是从0开始的)
*    第二个find从下标为3的字符开始找,也就是上次find结束的地方,那么这个find一上来就找到-,会不会因此而返回false,答案是不会,它会继续往后面找,看能不能在后面的字符串中找到符合条件的字符串片段,很幸运,它找到了,那就是45678,因为指定的字符串
*   片段的上限长度为5,所以在group输出45678而不是4567812,那么下标的始末为什么是4-9而不是4-8呢?虽然字符串片段的指定上限是5,但并不会因此就不继续往后面检查一位。
*    第三个find从下标为9的地方开始找,1,2,-,发现都不行,继续找!9,1,0,-发现满足条件了,返回true,同时group里输出910,下标又为什么从12开始呢?因为find从下标为12处才找到满足条件的字符串片段。
*    第四个find很可怜,-,1,1都不满足,后面又没有字符串了,所以只好返回false了、
*    为什么加了matches和reset后输出结果又变得不一样了?先从matches说起,matches要求全部匹配才能返回true,但是很不幸字符串的长度一看就不止5个字符,所以返回false是毫无疑问的。具体来说,matches也是一个字符一个字符检查的,当他检查到第一个“-”时发现
*   不是数字了,所以返回了false(但是就算全部是数字也返回false,就如上面所说的),关键是这个matches对后面的find有影响,因为find是从matches停止位开始检查的,就像下一个find是从上一个find停止位开始检查的一样,所以输出结果和上一段不一样了。
*    但是加了reset后,匹配器被重置,就相当于find可以从字符串的第一个字符开始检查了。
*    lookingAt()是每一次都从头开始检查是不是符合要求,不管有多少个lookingAt(),而123是符合要求的,所以会输出true
*    注意只有匹配成功,才可以通过 start、end 和 group 方法获取更多信息。
*/

Java 正则表达式里find()方法的使用

标签:

原文地址:http://www.cnblogs.com/xuyuhua/p/4748689.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!