以下では、2番目の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」になる)、2番目の一致は成功します。Matcherオブジェクトを見ると、最初に失敗したfind()の後に、ある種のグループ情報が格納されていることがわかります。Find()は、最初(前の一致がない場合)または最後に成功した一致のインデックスのいずれかで開始することになっています。UsePattern()は、入力内のマッチャーの位置を保持し、グループ情報を破棄することになっています(これも、明示的に使用していませんでした)。
何かが足りないのですが、何がわかりません。これをlookingAt()とリージョンの更新(この例など)で実装する必要があるのではないかと思いますが、このアプローチが機能しない理由はわかりません。