1

在下文中,我希望第二个 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()应该保留匹配器在输入中的位置,并丢弃组信息(同样,我没有明确使用)。

我错过了一些东西,但我不知道是什么。我怀疑我必须用 lookingAt() 来实现它并更新区域(例如这个例子),但我不知道为什么这种方法不起作用。

4

2 回答 2

5

您的第一个正则表达式会消耗整个字符串(\\\\s*)。当第二个正则表达式运行时,没有什么可以匹配的了。

如果你调用matcher.reset()它按预期工作。

于 2011-06-14T01:23:30.223 回答
1

看起来文档有点误导(或者实际上,它只是没有指定)find()失败后调用时的行为是什么。

我想预期的用法是find()重复调用直到失败,但永远不会在失败后不重置。

查看源代码确认Matcher有一个索引(字段last),在执行下一个“find()”时它开始搜索,当find()失败时,该索引被推进到最后并且不会重置。

reset()重置该索引,usePattern()没有。

于 2011-06-14T01:39:06.353 回答