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());
}
分享到:
相关推荐
`Matcher` 类是一个与输入字符串关联的 `Pattern` 的匹配器,它用于执行匹配操作。`Matcher` 类是可变的,可以通过调用不同的方法来改变其状态。以下是一些常用方法: 1. **方法 find() 和 lookingAt()** - 功能:...
- **Matcher类**:用于将正则表达式应用到具体的文本上,进行匹配操作。 #### 五、示例详解 为了更好地理解Java正则表达式的使用方法,以下通过几个示例来详细介绍其具体应用。 ##### 例1.1:解析IP地址和端口号 ...
- `boolean find(int start)`:从指定位置开始查找下一个与正则表达式匹配的子序列。 - **group() 方法**: - `String group()`:返回整个匹配的子序列作为字符串。 - `String group(int group)`:返回指定组...
Matcher是Pattern的一个关键接口,它提供了多种匹配方法来检查字符串是否符合给定的正则表达式。Matcher的主要方法包括: - boolean matches():尝试将整个输入序列与模式匹配。如果输入序列与整个模式完全匹配,则...
例如,当`str1 = "hello"`时,`matcher1.matches()`会返回`true`,因为整个字符串与正则表达式"hello"完全匹配。 2. `lookingAt()`:这个方法从输入序列的开头开始,看是否能找到匹配的子串。如果找到了,它返回`...
- `Matcher.find()`: 查找输入字符串中与正则表达式匹配的部分,返回true表示找到至少一次匹配。 - `Matcher.group()`: 返回上一次匹配成功的子字符串。 - `Matcher.replaceAll(String replacement)`: 使用给定的...
`Matcher`提供了诸如`matches()`、`find()`、`replaceAll()`、`replaceFirst()`等方法,这些方法都是基于正则表达式的。例如,`matches()`方法会检查整个输入字符串是否完全符合正则表达式,而`find()`则会在输入...
这个`Matcher`实例可以执行多种操作,如`matches()`(检查整个输入是否匹配正则表达式),`find()`(查找第一个匹配的部分),`group()`(获取匹配的子字符串)等。 在提供的示例中,`Pattern.split()`方法被用来...
`Pattern`类用于编译正则表达式,而`Matcher`类则执行实际的匹配操作。 1. **创建正则表达式**: 要匹配所有在花括号中的字符串,我们可以使用正向预查 `(?>\{)(.*?)(?>\})`。这个正则表达式的含义是:查找所有以...
- **Matcher类**:与Pattern配合使用,提供实际的匹配操作,如`matches()`、`lookingAt()`和`find()`方法。 - **matches()**:检查整个输入字符串是否符合给定的正则表达式。 - **lookingAt()**:从字符串开始...
2. Java中的`Pattern`和`Matcher`类:这两个类是Java中处理正则表达式的核心,`Pattern`用于编译模式,`Matcher`用于在具体字符串上执行匹配操作。 3. 正则表达式的匹配方法:如`matches()`、`find()`、`replaceAll...
- **Matcher**:对输入字符串进行匹配操作,提供find()、matches()、replaceAll()等方法。 - **PatternSyntaxException**:当正则表达式语法错误时抛出的异常。 在Java 11中,虽然正则表达式API没有大的改动,但...
在日常的软件开发过程中,正则表达式作为一种强大的文本处理工具被广泛应用于数据验证、文本搜索与替换等场景之中。尤其是在Java语言环境中,`java.util.regex`包提供了丰富的API来支持正则表达式的创建与使用。然而...
Matcher提供了多种方法来进行匹配操作,如matches()用于判断整个字符串是否匹配,find()则查找字符串中是否存在匹配的部分。例如: ```java if (matcher.matches()) { System.out.println("完全匹配"); } else if ...
`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正则表达式是一个强大且灵活的工具,通过理解并熟练运用字符类、量词、边界匹配、选择与分组等基本概念,以及预查、后顾和非贪婪匹配等高级特性,开发者可以处理复杂的文本匹配和处理任务。在实际编程中,结合...
`Pattern`类用于编译正则表达式,而`Matcher`类则是用来在特定输入字符串中查找与正则表达式匹配的序列。 1. **Pattern类**: - `Pattern.compile(String regex)`:这是编译正则表达式的基本方法,将字符串转换为`...
`Pattern`类用于编译正则表达式,`Matcher`类则用于对输入字符串进行模式匹配,而`PatternSyntaxException`则会在正则表达式语法错误时抛出。 1. **Pattern类**: - `Pattern.compile(String regex)`:用于编译...