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

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 方法获取更多信息。

*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值