一篇关于Matcher find方法深刻理解的文章
2024-09-06 07:24:52
知识点
find
首先find和matchs是不一样的,matchs是将字符串从开头到结尾,进行匹配,匹配成功即为true,反之为false,find是字符串的部分如果匹配成功即为true,反之即为false。
find匹配的正则如果在字符串中有多处能够匹配上,可以理解为将字符串分割成了多块。
通过代码,可以看到find()每执行一次之后,下次在执行就会从上次匹配到的字符串的下一个字符开始匹配
find(int var1)
指定从第几个索引处开始检索、匹配,在这个操作之前进行了reset操作。
reset
将find方法的相关参数进行初始化,这样再次find()就不是从上次匹配的字符串下一个字符开始匹配了,而是从第一个字符处开始匹配
group(int var1)
返回find到的第几个片段
源码
public boolean find() {
int var1 = this.last;
if (var1 == this.first) {
++var1;
}
if (var1 < this.from) {
var1 = this.from;
}
if (var1 <= this.to) {
return this.search(var1);
} else {
for(int var2 = 0; var2 < this.groups.length; ++var2) {
this.groups[var2] = -1;
}
return false;
}
}
public boolean find(int var1) {
int var2 = this.getTextLength();
if (var1 >= 0 && var1 <= var2) {
this.reset();
return this.search(var1);
} else {
throw new IndexOutOfBoundsException("Illegal start index");
}
}
public Matcher reset() {
this.first = -1;
this.last = 0;
this.oldLast = -1;
int var1;
for(var1 = 0; var1 < this.groups.length; ++var1) {
this.groups[var1] = -1;
}
for(var1 = 0; var1 < this.locals.length; ++var1) {
this.locals[var1] = -1;
}
this.lastAppendPosition = 0;
this.from = 0;
this.to = this.getTextLength();
return this;
}
public String group() {
return this.group(0);
}
public String group(int var1) {
if (this.first < 0) {
throw new IllegalStateException("No match found");
} else if (var1 >= 0 && var1 <= this.groupCount()) {
return this.groups[var1 * 2] != -1 && this.groups[var1 * 2 + 1] != -1 ? this.getSubSequence(this.groups[var1 * 2], this.groups[var1 * 2 + 1]).toString() : null;
} else {
throw new IndexOutOfBoundsException("No group " + var1);
}
}
故事是这样的
Matcher matcher = p.matcher(myURLValue.toString());
Matcher matcher2 = p2.matcher(myURLValue.toString());
log.debug("matcher.find()---------------------------------------,%s",matcher.find());
log.debug("matcher2.find()---------------------------------------,%s",matcher2.find());
if ( matcher.find()){
log.debug("matcher");
}else if (matcher2.find()){
log.debug("matcher2");
}
tip:工作中关于业务的代码已经省去,这几行足以说明问题~
上图的运行结果是什么???
matcher.find()---------------------------------------,true
matcher.find()---------------------------------------,false
没了
为什么???
就算有一个是true至少会输出下面的任意一个matcher或者matcher2把。
探索
我都怀疑if和else if里面都是false,于是傻傻的直接将if和else if里面的判断条件设为了true,发现结果是正确的,说明上面例子中的if和else if里面都是false。
问题解决
方法一:
Matcher matcher = p.matcher(myURLValue.toString());
Matcher matcher2 = p2.matcher(myURLValue.toString());
log.debug("matcher.find()---------------------------------------,%s",matcher.find());
log.debug("matcher2.find()---------------------------------------,%s",matcher2.find());
matcher.reset();
matcher2.reset();
if ( matcher.find()){
log.debug("matcher");
}else if (matcher2.find()){
log.debug("matcher2");
}
方法二:
Matcher matcher = p.matcher(myURLValue.toString());
Matcher matcher2 = p2.matcher(myURLValue.toString());
if ( matcher.find()){
log.debug("matcher");
}else if (matcher2.find()){
log.debug("matcher2");
}
方法三:
Matcher matcher = p.matcher(myURLValue.toString());
Matcher matcher2 = p2.matcher(myURLValue.toString());
log.debug("matcher.find()---------------------------------------,%s",matcher.find());
log.debug("matcher2.find()---------------------------------------,%s",matcher2.find());
if ( matcher.find(1)){
log.debug("matcher");
}else if (matcher2.find(1)){
log.debug("matcher2");
}
总结
可以看到我的问题是出在,打了两个debug,执行过一次find方法,索引从第一次匹配的下一个开始,因为我的字符串中只有一个片段能够和正则匹配,所以下次if或者else if的时候是都是false的。
解决的办法就是要么reset初始化一下,要么删除掉debug那两行,要么就用有参的find方法,指定从第几个开始检索。
最新文章
- Lucene提供的条件判断查询
- 用gcc进行程序的编译
- Android 四大组件之四(ContentProvider)
- cordova platform add specified version
- winrt反射
- WPF程序最小化到任务通知栏
- Xamarin Visual Studio提示找不到AssemblyAttributes.cs文件
- <;构建之法>;之一至二章
- 转__Android Studio ,基于intellij idea
- CUDA从入门到精通
- ubuntu下安装JDK详解
- 解决UIScrollView 的点击事件
- JVM Input Arguments Lookup (JMX)(转)
- 几种MQ消息队列对比与消息队列之间的通信问题
- vue 基础-->;进阶 教程(3):组件嵌套、组件之间的通信、路由机制
- C#设计模式(3)-工厂方法模式
- Qt中的坐标系统
- java - day004 - 数组排序,插入,冒泡
- ue4 StringTable
- Hibernate的核心接口