`
屌丝学Java
  • 浏览: 29832 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

正则匹配-Matcher类matches()与find()

    博客分类:
  • jsp
 
阅读更多
Matcher类matches()与find()区别
众所周知JAVA有一个强大的工具包java.util.regex, 通过Pattern和 Matcher这两个类可以通过正则表达式来匹配字符串.
Pattern是正则表达式的编译后的对象形式,即正则模式.
Matcher是这个正则模式创建的匹配给定输入与此模式的匹配器.
典型的调用顺序是
String regex = "a*b";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher("aaaaab");
有了上面的匹配器对象m, 就可以通过m.matches()和m.find()方法判断"aaaaab"是否与正则regex

众所周知JAVA有一个强大的工具包java.util.regex, 通过Pattern和 Matcher这两个类可以通过正则表达式来匹配字符串.
Pattern是正则表达式的编译后的对象形式,即正则模式.
Matcher是这个正则模式创建的匹配给定输入与此模式的匹配器.
典型的调用顺序是
String regex = "a*b";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher("aaaaab");
有了上面的匹配器对象m, 就可以通过m.matches()和m.find()方法判断"aaaaab"是否与正则regex匹配.

这两个方法都可以判断是否匹配, 但是它们有什么区别呢?
1. 匹配方式不一样
matches() 是拿整个输入的字符串和定义的正则模式匹配;
find() 是包含匹配, 整个输入的字符串包含定义的正则模式.

上面的区别并不是这里我想说的, 我想说的是两个方法的调用顺序不一致, 结果也会不一致, 先看代码
    @Test
    public void testRegex()
    {
        String str0 = "I want to train 'xxx' to 'yyy'";
        Matcher matcher0 = pattern0.matcher(str0);
  
        assertTrue(matcher0.matches());
        assertTrue(matcher0.find());
    }
我期望这个单元测试肯定能一路绿灯, 结果assertTrue(matcher0.find());亮了红灯.
接下来我把两个断言语句换了位置, 重新测试结果都能通过.
Why???
怀疑matcher0对象在调用matches()后肯定修改了这个对象的某个全局变量.
Debug进Matcher类的源码里面看一下, 果然发现在match()方法中有this.oldLast = this.last;等代码, 而find()中则没有.
这下就能解释了为什么调用顺序不一致结果也不一致, 除非不是同一个Matcher对象
    @Test
    public void testRegex()
    {
        String str0 = "I want to train 'xxx' to 'yyy'";
        Matcher matcher0 = pattern0.matcher(str0);
        Matcher matcher1 = pattern0.matcher(str0);
        assertTrue(matcher0.matches());
        assertTrue(matcher1 .find());
    }

分享到:
评论

相关推荐

    JAVA正则表达式--Pattern和Matcher

    `Matcher` 类是一个与输入字符串关联的 `Pattern` 的匹配器,它用于执行匹配操作。`Matcher` 类是可变的,可以通过调用不同的方法来改变其状态。以下是一些常用方法: 1. **方法 find() 和 lookingAt()** - 功能:...

    java正则表达式----pdf文档 简明扼要

    - **Matcher类**:用于将正则表达式应用到具体的文本上,进行匹配操作。 #### 五、示例详解 为了更好地理解Java正则表达式的使用方法,以下通过几个示例来详细介绍其具体应用。 ##### 例1.1:解析IP地址和端口号 ...

    java正则表达式Pattern,Matcher

    - `boolean find(int start)`:从指定位置开始查找下一个与正则表达式匹配的子序列。 - **group() 方法**: - `String group()`:返回整个匹配的子序列作为字符串。 - `String group(int group)`:返回指定组...

    JAVA正则表达式Pattern和Matcher

    Matcher是Pattern的一个关键接口,它提供了多种匹配方法来检查字符串是否符合给定的正则表达式。Matcher的主要方法包括: - boolean matches():尝试将整个输入序列与模式匹配。如果输入序列与整个模式完全匹配,则...

    java_正则表达式pattern类Matcher类_(字符串匹配)

    例如,当`str1 = "hello"`时,`matcher1.matches()`会返回`true`,因为整个字符串与正则表达式"hello"完全匹配。 2. `lookingAt()`:这个方法从输入序列的开头开始,看是否能找到匹配的子串。如果找到了,它返回`...

    JAVA 正则表达式测试器

    - `Matcher.find()`: 查找输入字符串中与正则表达式匹配的部分,返回true表示找到至少一次匹配。 - `Matcher.group()`: 返回上一次匹配成功的子字符串。 - `Matcher.replaceAll(String replacement)`: 使用给定的...

    java正则表达式匹配工具

    `Matcher`提供了诸如`matches()`、`find()`、`replaceAll()`、`replaceFirst()`等方法,这些方法都是基于正则表达式的。例如,`matches()`方法会检查整个输入字符串是否完全符合正则表达式,而`find()`则会在输入...

    JAVA正则表达式 Pattern和Matcher

    这个`Matcher`实例可以执行多种操作,如`matches()`(检查整个输入是否匹配正则表达式),`find()`(查找第一个匹配的部分),`group()`(获取匹配的子字符串)等。 在提供的示例中,`Pattern.split()`方法被用来...

    java 正则匹配所有 {},并取出所有符合的字符串。

    `Pattern`类用于编译正则表达式,而`Matcher`类则执行实际的匹配操作。 1. **创建正则表达式**: 要匹配所有在花括号中的字符串,我们可以使用正向预查 `(?>\{)(.*?)(?>\})`。这个正则表达式的含义是:查找所有以...

    java-regex正则表达式

    - **Matcher类**:与Pattern配合使用,提供实际的匹配操作,如`matches()`、`lookingAt()`和`find()`方法。 - **matches()**:检查整个输入字符串是否符合给定的正则表达式。 - **lookingAt()**:从字符串开始...

    火山安卓正则匹配案例源码.zip

    2. Java中的`Pattern`和`Matcher`类:这两个类是Java中处理正则表达式的核心,`Pattern`用于编译模式,`Matcher`用于在具体字符串上执行匹配操作。 3. 正则表达式的匹配方法:如`matches()`、`find()`、`replaceAll...

    java11编译的正则匹配测试器

    - **Matcher**:对输入字符串进行匹配操作,提供find()、matches()、replaceAll()等方法。 - **PatternSyntaxException**:当正则表达式语法错误时抛出的异常。 在Java 11中,虽然正则表达式API没有大的改动,但...

    浅谈Java中正则表达式的优化方法

    在日常的软件开发过程中,正则表达式作为一种强大的文本处理工具被广泛应用于数据验证、文本搜索与替换等场景之中。尤其是在Java语言环境中,`java.util.regex`包提供了丰富的API来支持正则表达式的创建与使用。然而...

    JAVA正则性表达式匹配软件

    Matcher提供了多种方法来进行匹配操作,如matches()用于判断整个字符串是否匹配,find()则查找字符串中是否存在匹配的部分。例如: ```java if (matcher.matches()) { System.out.println("完全匹配"); } else if ...

    JAVA正则表达式大全

    `Matcher`对象是实际执行匹配操作的对象,它与输入字符串关联,并提供了诸如`matches()`、`find()`、`group()`等方法。 4. **正则表达式.ppt** 这可能是一个包含正则表达式教程的演示文稿,可能涵盖了更复杂的概念...

    常用正则工具类

    - `Matcher`的主要方法有:`find()`(查找下一个匹配项),`matches()`(整个字符串是否匹配),`group()`(获取匹配的子串),`replaceAll()`(替换所有匹配的子串)等。 3. **正则工具类的实现** - 在Java项目...

    正则表达式的详细案例

    - `boolean matcher.find()`:在输入字符串中查找下一个匹配项 - `int matcher.groupCount()`:返回所有捕获分组的数量 - `String matcher.group(int group)`:获取指定分组的匹配内容 3. 字符串方法: - `...

    Java正则表达式详解 doc格式文档

    Java正则表达式是一个强大且灵活的工具,通过理解并熟练运用字符类、量词、边界匹配、选择与分组等基本概念,以及预查、后顾和非贪婪匹配等高级特性,开发者可以处理复杂的文本匹配和处理任务。在实际编程中,结合...

    java正则表达式截取demo下载即可运行

    `Pattern`类用于编译正则表达式,而`Matcher`类则是用来在特定输入字符串中查找与正则表达式匹配的序列。 1. **Pattern类**: - `Pattern.compile(String regex)`:这是编译正则表达式的基本方法,将字符串转换为`...

    java编写的正则表达式解析器

    `Pattern`类用于编译正则表达式,`Matcher`类则用于对输入字符串进行模式匹配,而`PatternSyntaxException`则会在正则表达式语法错误时抛出。 1. **Pattern类**: - `Pattern.compile(String regex)`:用于编译...

Global site tag (gtag.js) - Google Analytics