1

以下では、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()とリージョンの更新(この例など)で実装する必要があるのではないかと思いますが、このアプローチが機能しない理由はわかりません。

4

2 に答える 2

5

最初の正規表現は文字列全体を消費します(\\\\s*)。2 番目の正規表現が実行されると、一致するものは何も残っていません。

呼び出すmatcher.reset()と、期待どおりに動作します。

于 2011-06-14T01:23:30.223 に答える
1

ドキュメントは、find()失敗後に呼び出すときの動作が少し誤解を招く (または実際には指定されていない) ようです。

想定される使用方法は、find()失敗するまで繰り返し呼び出されますが、失敗した後はリセットせずに呼び出されることはないと思います。

ソースコードを見ると、 には次の「find()」を実行するときに検索を開始Matcherするインデックス (フィールド) があり、失敗した場合はそのインデックスが最後まで進められ、リセットされないことが確認されます。lastfind()

reset()そのインデックスをリセットしますが、usePattern()しません。

于 2011-06-14T01:39:06.353 に答える