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());
}
分享到:
相关推荐
首先一个Pattern实例订制了一个所用语法与PERL的类似的正则表达式经编译后的模式,然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行字符串的匹配工作。 以下我们就分别来看看这两个类:
主要介绍了正则表达式Matcher类中group方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
安装曲线匹配器可以通过NPM或Yarn安装yarn add curve-matcher或者npm install curve-matcher入门curve-matcher的核心是一个名为shapeSimilarity的函数,该函数估计2条曲线的形状彼此之间的相似程度,并返回介于0和1...
特征点匹配,Feature point matching Feature point matching
前端开源库-jest-matcher-deep-close-tojest matcher deep-close,扩展jest以断言具有近似值的数组
java_正则表达式pattern类Matcher类_(字符串匹配)
Laravel开发-laravel-score-matcher 指定雄辩的模型
Java正则表达式:Pattern类和Matcher类
C ++正则表达式匹配器这是一个用于匹配正则表达式的教育图书馆。 它运行速度非常快,比C ++ 11库中构建的速度快几个数量级,并且在性能上几乎胜过其他任何知名库。 但是,它非常简单:仅在ASCII符号上运行,不支持多...
matcher - 简单的通配符匹配
dry-matcher, 灵活的,表达式 Pattern 匹配,用于 ruby 干匹配器 灵活的,表达式 Pattern 匹配,用于 ruby 。链接文档文档许可证版权所有 © 2015 -2016 Icelab 。 dry是自由软件,可以根据许可协议中指定的条款重新...
模糊匹配器将字符串与字符串列表进行模糊匹配。安装npm install fuzzy-matcher使用范例var match = require('fuzzy-match');function matches(search, lines) { var matched = []; for (var k = 0; k < lines....
引入 Matcher 类 import Matcher from 'data-matcher'; 链式调用,将后端接口数据转换为前端的定义数据结构 const sourceData = { a: 1, b: '1', }; const matcher = new Matcher(sourcedata); const { data: ...
正则表达式之道.doc 正则表达式中的特殊字符.doc Java正则表达式详解.doc 正则表达式.ppt JAVA正则表达式--Pattern和Matcher.doc 例子
模板匹配器 模式匹配提取到单独的模块中安装npm install template-matcher --save用法 var matcher = require ( 'template-matcher' ) ;var matches = matcher ( '<div><input type="${attr}"/>${content}...
基于GMS特征的图像匹配,C++,matlab,python
JAVA正则表达式 Pattern和Matcher,详细说明正则表达式的应用
模式匹配器是一种原型软件工具,用于将STIX观测数据内容与STIX指标中使用的模式进行匹配。 匹配器接受一个模式和一个或多个带时间戳的观察值,并确定观察值是否与该模式指定的条件匹配。 该工具的目的是评估实现...
Hamcrest Feature Matcher Generator for POJOs Inspired by lot of dummy work to create matchers for fields in auto-generated beans to write POJO-based tests. Generates Hamcrest's Feature Matchers ...
萨里夫模式匹配器 可将结果持久保存到SARIF的质量域不可知正则表达式模式匹配器NuGet软件包从该存储库中发布了以下软件包: 最新官方发布如何贡献sarif模式匹配器正在接受贡献。 如果您已经为现有问题提交了PR,请在...