本篇主要记录java.util.regex.Matcher类find()与matches()的区别
今天在做公司一个小项目的时候偶然发现相同的正则模式,调用find()与matches()出来的结果不一致,困扰了些许时间,就用这篇博客记录一下
首先看代码:
public class RegExTest {
public static void main(String[] args){
String str = "122,12,132,912";
replace(str);
}
static void replace(String str){
Pattern pattern = Pattern.compile("\\b12\\b");
Matcher matcher = pattern.matcher(str);
System.out.println("matcher.matches()的结果是:"+(matcher.matches()));
System.out.println("matcher.find()的结果是:"+(matcher.find()));
System.out.println("Pattern.matches(\"\\b12\\b\",str)的结果是:"+(Pattern.matches("\\b12\\b",str)));
}
}
输出的结果是:
matcher.matches()的结果是:false
matcher.find()的结果是:true
Pattern.matches("\b12\b",str)的结果是:false
想要只匹配两个”,”之间的12而避免匹配”122,912”中的12,可以看到只有matcher.find()
的输出为true。先看看官方文档的说明。
public boolean find()
:尝试查找与该模式匹配的输入序列的下一个子序列。此方法从匹配器区域的开头开始,如果该方法的前一次调用成功了并且从那时开始匹配器没有被重置,则从以前匹配操作没有匹配的第一个字符开始。
返回:
当且仅当输入序列的子序列匹配此匹配器的模式时才返回 true。public boolean matches()
:尝试将整个区域与模式匹配。
返回:
当且仅当整个区域序列匹配此匹配器的模式时才返回 true。
所以find()
匹配的是目标序列的子序列,而matches()
需要匹配整个目标序列。
Pattern.matches()
、string.matches()
方法的效果与matcher.matches()
效果相同,匹配整个目标序列。
参考文档:
版权声明:自由转载-非商用-非演绎-保持署名(创意共享3.0许可证)