A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 自由自在2014 于 2014-2-25 19:02 编辑

如题!!求解答 附带代码更好

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

2 个回复

倒序浏览
匹配方式不一样
matches() 是拿整个输入的字符串和定义的正则模式匹配;
find() 是包含匹配, 整个输入的字符串包含定义的正则模式.
调用顺序不一致, 结果也会不一致
  1. public void testRegex()
  2.     {
  3.         String str0 = "I want to train 'xxx' to 'yyy'";
  4.         Matcher matcher0 = pattern0.matcher(str0);
  5.    
  6.         assertTrue(matcher0.matches());
  7.         assertTrue(matcher0.find());
  8.     }
复制代码

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

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
Maple 发表于 2014-2-25 19:11
匹配方式不一样
matches() 是拿整个输入的字符串和定义的正则模式匹配;
find() 是包含匹配, 整个输入的字符 ...

谢谢,我明白了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马