java正则表达式中,matcher.matches()和matcher.find()相互影响
java 正则表达式中,matcher.matches() 和 matcher.find()相互影响。
测试在.find()之后,用.group()把find到的值取出来。
先看一个例子
@Test
public void testReg() {
Pattern pattern = Pattern.compile("\\d{11}");
Matcher matcher = pattern.matcher("13188889999我的手机号");
boolean b = matcher.find(); //返回 true
System.out.println("b = " + b);// b = true
String group = matcher.group(); // 返回 13188889999
System.out.println("group = " + group); // group = 13188889999
boolean matches = matcher.matches(); // 返回false
System.out.println("matches = " + matches); // matches = false
}
@Test
public void testReg2() {
Pattern pattern = Pattern.compile("\\d{11}");
Matcher matcher = pattern.matcher("13188889999我的手机号");
boolean matches = matcher.matches(); // 返回false
System.out.println("matches = " + matches); // matches = false
boolean b = matcher.find(); //返回 false
System.out.println("b = " + b);// b = false
String group = matcher.group(); // 报错 : java.lang.IllegalStateException: No match found
System.out.println("group = " + group); // 未到达
}
结论:
在使用.find()之前,如果没有用过.matches(),那么可以正常返加手机号码。但是如果在使用.find()之前,就使用过一次.matches(),那么不论.matches()的结果是true还是false,都不会再得到手机号了,原因是调用.matches()相当于同时也调用一次.find(),那么.matches()之后再用.find()就相当于第二次.find()了。
以下更清楚地表达这个意思:
@Test
public void testReg2() {
Pattern pattern = Pattern.compile("\\d{11}");
Matcher matcher = pattern.matcher("13188889999我的手机号,13222222222这是她的手机号。");
boolean matches = matcher.matches(); // 返回false
System.out.println("matches = " + matches); // matches = false
boolean b = matcher.find(); //返回 true
System.out.println("b = " + b);// b = true
String group = matcher.group(); // 返回 : 13222222222
System.out.println("group = " + group); // group = 13222222222
}
说明
选用了一次.matches()之后,再用一次.find(),那么会返回第二个手机号码。第一个手机号码去哪里了呢?不好意思,被前面的.matches()吃掉了。
我们再看一个例子
@Test
public void testReg2() {
Pattern pattern = Pattern.compile("\\d{11}");
Matcher matcher = pattern.matcher("13188889999我的手机号,13222222222这是她的手机号。");
boolean b = matcher.find(); //返回 true
System.out.println("b = " + b);// b = true
String group = matcher.group(); // 返回 : 13188889999
System.out.println("group = " + group); // group = 13188889999
boolean b2 = matcher.find(); //返回 true
System.out.println("b2 = " + b2);// b = true
String group2 = matcher.group(); // 返回 : 13222222222
System.out.println("group2 = " + group2); // group = 13222222222
boolean matches = matcher.matches(); // 返回false
System.out.println("matches = " + matches); // matches = false
}
说明
开始的时间不使用.matches(),第一次使用.find()可以返回第一个手机号,第二次使用.find()则会返回第二个手机号。
接下来我们把.matches()再移到上面去看看:
@Test
public void testReg2() {
Pattern pattern = Pattern.compile("\\d{11}");
Matcher matcher = pattern.matcher("13188889999我的手机号,13222222222这是她的手机号。");
boolean matches = matcher.matches(); // 返回false
System.out.println("matches = " + matches); // matches = false
boolean b = matcher.find(); //返回 true
System.out.println("b = " + b);// b = true
String group = matcher.group(); // 返回 : 13222222222
System.out.println("group = " + group); // group = 13222222222
boolean b2 = matcher.find(); //返回 false
System.out.println("b2 = " + b2);// b = false
String group2 = matcher.group(); // 报错 : java.lang.IllegalStateException: No match found
System.out.println("group2 = " + group2); // 未到达
}
说明
使用.matches()之后,第一次.find()会返回手机号,但是返回的不是第一个手机号,而第二个手机号。为什么呢?因为第一个手机号被.matches()吃掉了。所以只能返回第一个手机号了。那么,第二次使用.find()就没有手机号可以返回了,只能报错了。
最后说明一下
.matches()是完全匹配,要整个字符与表达式表达的一模一样才行。而.find()是部分匹配,字符串内能截取出多少段符合表达式的小串,就能一次次地逐个逐个把它们find出来
@Test
public void testReg3() {
Pattern pattern = Pattern.compile("\\d{11}");
Matcher matcher = pattern.matcher("13188889999");
boolean matches = matcher.matches(); // 返回true
System.out.println("matches = " + matches); // matches = true
String group = matcher.group(); // 返回13188889999,整个字符串与表达式一模一样,不多不少才行。
System.out.println("group = " + group); // group = 13188889999
}