知识点

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方法深刻理解的文章的更多相关文章

  1. lucene-一篇分词器介绍很好理解的文章

    本文来自这里在前面的概念介绍中我们已经知道了分析器的作用,就是把句子按照语义切分成一个个词语.英文切分已经有了很成熟的分析器: StandardAnalyzer,很多情况下StandardAnalyz ...

  2. [转]深刻理解Python中的元类(metaclass)以及元类实现单例模式

    使用元类 深刻理解Python中的元类(metaclass)以及元类实现单例模式 在看一些框架源代码的过程中碰到很多元类的实例,看起来很吃力很晦涩:在看python cookbook中关于元类创建单例 ...

  3. Atitit 图像处理 深刻理解梯度原理计算.v1 qc8

    Atitit 图像处理 深刻理解梯度原理计算.v1 qc8 1.1. 图像处理  梯度计算  基本梯度 内部梯度 外部梯度 方向梯度1 2. 图像梯度就是图像边缘吗?2 1.1. 图像处理  梯度计算 ...

  4. 转载:JAVA中关于set()和get()方法的理解及使用

    对于JAVA初学者来说,set和get这两个方法似乎已经很熟悉了,这两个方法是JAVA变成中的基本用法,也是出现频率相当高的两个方法. 为了让JAVA初学者能更好的理解这两个方法的使用和意义,今天笔者 ...

  5. javamail模拟邮箱功能--邮件删除-中级实战篇【邮件标记方法】(javamail API电子邮件实例)

    前言: JavaMail jar包下载地址:http://java.sun.com/products/javamail/downloads/index.html 本章可能是讲解javamail的最后一 ...

  6. 深刻理解Java中final的作用(一):从final的作用剖析String被设计成不可变类的深层原因

    声明:本博客为原创博客,未经同意,不得转载!小伙伴们假设是在别的地方看到的话,建议还是来csdn上看吧(原文链接为http://blog.csdn.net/bettarwang/article/det ...

  7. java中set和get方法的理解

    对于JAVA初学者来说,set和get这两个方法似乎已经很熟悉了,这两个方法是JAVA变成中的基本用法,也是出现频率相当高的两个方法. 为了让JAVA初学者能更好的理解这两个方法的使用和意义,今天笔者 ...

  8. 深刻理解iosBlock

    深刻理解iosBlock ///一个控制器里的方法 - (void)setRefreshHeader { ACWeakSelf(self); self.tableView.mj_header = [M ...

  9. javascript 面向对象程序设计--深刻理解对象

    javascript中,每个对象都是基于一个引用类型创建的,我们可以把ECMAScript 的对象想象成散列表:无非就是一组名值对,其中值可以是数据或函数. 深刻理解对象 创建自定义对象的最简单方式就 ...

随机推荐

  1. WPF RichTextBox 当前光标后一个字符是文档的第几个字符

    WPF RichTextBox 当前光标后一个字符是文档的第几个字符 运行环境:Win10 x64, NetFrameWork 4.8, 作者:乌龙哈里,日期:2019-05-05 参考: TextP ...

  2. spark在不同环境下的搭建|安装|local|standalone|yarn|HA|

    spark的集群环境安装搭建 1.spark local模式运行环境搭建 常用于本地开发测试,本地还分为local单线程和local-cluster多线程; 该模式被称为Local[N]模式,是用单机 ...

  3. NX二次开发-UFUN多选菜单对话框uc1605

    NX11+VS2013 #include <uf.h> #include <uf_ui.h> UF_initialize(); //多选菜单对话框 char sPromptSt ...

  4. csp-s模拟测试98

    csp-s模拟测试98 $T1$??不是我吹我轻松手玩20*20.$T2$装鸭好像挺可做?$T3$性质数据挺多提示很明显? $One$ $Hour$ $Later$ 这$T1$什么傻逼题真$jb$难调 ...

  5. iOS 多层级的immutable objects 转换成 mutable objects

    第一种方法是:将多层级的递归转换 方法: +(id) recursiveMutable:(id)object { if([object isKindOfClass:[NSDictionary clas ...

  6. hdu多校第五场1002 (hdu6625) three arrays 字典树/dfs

    题意: 给你两个序列a,b,序列c的某位是由序列a,b的此位异或得来,让你重排序列ab,找出字典序最小的序列c. 题解: 如果能找到a,b序列中完全一样的值当然最好,要是找不到,那也尽量让低位不一样. ...

  7. Java-Class-@I:org.springframework.beans.factory.annotation.Autowired

    ylbtech-Java-Class-@I:org.springframework.beans.factory.annotation.Autowired 1.返回顶部   2.返回顶部 1. pack ...

  8. LED 发光二极管压降

    常用发光二极管的压降 1. 直插超亮发光二极管压降 主要有三种颜色,然而三种发光二极管的压降都不相同,具体压降参考值如下: 红色发光二极管的压降为2.0--2.2V  黄色发光二极管的压降为1.8—2 ...

  9. windows下装LINUX后,进不了系统

    在网上找了一款叫"DisckGenius"的软件,运行后选“硬盘”/“重建主引导记录(MBR)”,然后重启,就正常了. 还有系统盘最好是FAT32格式的.

  10. 高手总结CSS书写技巧

    这个时候我们就需要针对不同的浏览器去写不同的CSS,让它能够同时兼容不同的浏览器,能在不同的浏览器中也能得到我们想要的页面效果.这个针对不同的浏览器写不同的CSS code的过程,就叫CSS hack ...