在与量词不匹配后,Java的matcher.find()保留了什么样的状态?

Ric*_*her 1 java regex matcher

在下面,我希望第二个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());
Run Code Online (Sandbox Code Playgroud)

如果量化器从第一个正则表达式中删除(变为简单的"asdf"),则第二个匹配成功.查看Matcher对象会发现在第一个不成功的find()之后存储了某种组信息,尽管我没想到它.Find()应该从头开始(如果没有前一个匹配)或者在上一次成功匹配的索引处开始.UsePattern()应该保留Matcher在输入中的位置,并丢弃组信息(同样,我没有明确使用).

我错过了什么,但我不知道是什么.我怀疑我必须使用lookingAt()并更新区域(例如此示例)来实现它,但我不知道为什么这种方法不起作用.

ado*_*out 5

你的第一个正则表达式消耗整个字符串(\\\\s*).当第二个正则表达式运行时,没有任何东西可以匹配.

如果你打电话matcher.reset()它按预期工作.