一篇关于Matcher find方法深刻理解的文章
知识点
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方法,指定从第几个开始检索。
一篇关于Matcher find方法深刻理解的文章的更多相关文章
- lucene-一篇分词器介绍很好理解的文章
本文来自这里在前面的概念介绍中我们已经知道了分析器的作用,就是把句子按照语义切分成一个个词语.英文切分已经有了很成熟的分析器: StandardAnalyzer,很多情况下StandardAnalyz ...
- [转]深刻理解Python中的元类(metaclass)以及元类实现单例模式
使用元类 深刻理解Python中的元类(metaclass)以及元类实现单例模式 在看一些框架源代码的过程中碰到很多元类的实例,看起来很吃力很晦涩:在看python cookbook中关于元类创建单例 ...
- Atitit 图像处理 深刻理解梯度原理计算.v1 qc8
Atitit 图像处理 深刻理解梯度原理计算.v1 qc8 1.1. 图像处理 梯度计算 基本梯度 内部梯度 外部梯度 方向梯度1 2. 图像梯度就是图像边缘吗?2 1.1. 图像处理 梯度计算 ...
- 转载:JAVA中关于set()和get()方法的理解及使用
对于JAVA初学者来说,set和get这两个方法似乎已经很熟悉了,这两个方法是JAVA变成中的基本用法,也是出现频率相当高的两个方法. 为了让JAVA初学者能更好的理解这两个方法的使用和意义,今天笔者 ...
- javamail模拟邮箱功能--邮件删除-中级实战篇【邮件标记方法】(javamail API电子邮件实例)
前言: JavaMail jar包下载地址:http://java.sun.com/products/javamail/downloads/index.html 本章可能是讲解javamail的最后一 ...
- 深刻理解Java中final的作用(一):从final的作用剖析String被设计成不可变类的深层原因
声明:本博客为原创博客,未经同意,不得转载!小伙伴们假设是在别的地方看到的话,建议还是来csdn上看吧(原文链接为http://blog.csdn.net/bettarwang/article/det ...
- java中set和get方法的理解
对于JAVA初学者来说,set和get这两个方法似乎已经很熟悉了,这两个方法是JAVA变成中的基本用法,也是出现频率相当高的两个方法. 为了让JAVA初学者能更好的理解这两个方法的使用和意义,今天笔者 ...
- 深刻理解iosBlock
深刻理解iosBlock ///一个控制器里的方法 - (void)setRefreshHeader { ACWeakSelf(self); self.tableView.mj_header = [M ...
- javascript 面向对象程序设计--深刻理解对象
javascript中,每个对象都是基于一个引用类型创建的,我们可以把ECMAScript 的对象想象成散列表:无非就是一组名值对,其中值可以是数据或函数. 深刻理解对象 创建自定义对象的最简单方式就 ...
随机推荐
- ie兼容小知识点
1.ie的滤镜特别针对ie使用css3的使用 (1)从css3渐变:filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=# ...
- cmd操作SQLService数据库
1.win+R 输入cmd2.输入sqlcmd -s 服务器名称3. 1> 输入 use 数据库名称4. 2> go5. 1> select *from 表名6. 2> go
- R语言 环境设置
尝试在线环境 你真的不需要设置自己的环境来开始学习R编程语言. 原因很简单,我们已经在线设置了R编程环境,以便您可以在进行理论工作的同时在线编译和执行所有可用的示例. 这给你对你正在阅读的信心,并用不 ...
- Python 爬取赶集网租房信息
代码已久,有可能需要调整 #coding:utf-8 from bs4 import BeautifulSoup #有这个bs4不用正则也可以定位要爬取的内容了 from urlparse impor ...
- Noip 2012 day2t1 同余方程
Description 求关于x的同余方程ax ≡ 1 (mod b)的最小正整数解. Input 输入文件为mod.in. 输入只有一行,包含两个正整数 a, b,用一个空格隔开. Output 输 ...
- pytorch实现kaggle猫狗识别
参考:https://blog.csdn.net/weixin_37813036/article/details/90718310 kaggle是一个为开发商和数据科学家提供举办机器学习竞赛.托管数据 ...
- fabric.js 限制缩放的最大最小比例
var rect = new fabrics.Rect({ v: true, top: 216, left: 384, width: 160, height: 90, fill: 'transpare ...
- 牛客多校第八场 G Gemstones 栈/贪心
题意: 对于一个序列,把可以把连着三个相同的字母拿走,问最多拿走多少组. 题解: 直接模拟栈,三个栈顶元素相同则答案+1,并弹出栈 #include<bits/stdc++.h> usin ...
- iOS开发之3D Touch
1.简介 3DTouch是在6s之后苹果的一项技术,只能在6s及其以上机型真机运行,Xcode的模拟器是不支持的. Quick Actions(点击icon的快捷方式) Peek&Pop(应用 ...
- class3_Entry & Text 输入和文本框
程序总体运行效果图如下; #!/usr/bin/env python # -*- coding:utf-8 -*- # -------------------------------------- ...