与量词不匹配后,Java的matcher.find会保留哪种状态?

问题描述

| 在下面,我希望第二个find()成功,但是不会成功。为什么?
Matcher matcher = 
    Pattern.compile(\"\\\\s*asdf\").matcher(\"apple banana cookie\");

// returns false as expected
matcher.find();

// resets groups (that weren\'t being explicitly being used anyway),but not state.
matcher.usePattern(Pattern.compile(\"\\\\s*banana\")); 

// returns false,expected true.
System.out.println(matcher.find());
如果从第一个正则表达式中删除了量词(简称为\“ asdf \”),则第二个匹配成功。查看Matcher对象会发现在第一个未成功的find()之后存储了某种组信息,尽管我不希望如此。 Find()应该从开头(如果没有以前的匹配)开始,或者从最后一次成功匹配的索引开始。 UsePattern()应该保留Matcher在输入中的位置,并丢弃组信息(同样,我没有显式使用它)。 我缺少了一些东西,但我不知道。我怀疑我必须使用lookingAt()来实现这一点并更新区域(例如本示例),但是我不知道为什么这种方法行不通。     

解决方法

        看来文档有点误导(或者实际上,它只是没有指定)失败后调用ѭ1时的行为。 我想期望的用法是反复调用
find()
,直到失败为止,但在失败后才重设它。 查看源代码可确认
Matcher
具有一个索引(字段
last
),当执行下一个\'find()\'时,它会从该索引开始搜索,而当
find()
失败时,该索引将前进至末尾且不是重启。
reset()
重置该索引,
usePattern()
不重置。     ,        您的第一个正则表达式会消耗整个字符串
(\\\\\\\\s*)
。当第二个正则表达式运行时,没有其他匹配项。 如果您拨打
matcher.reset()
,它将按预期工作。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...