在下面,我期望第二個find()成功,但它不。爲什麼? 與量詞不匹配後,Java的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());
如果量詞從第一正則表達式去除(簡單地成爲「ASDF」),所述第二匹配成功。查看Matcher對象會揭示某些組信息在第一次不成功的find()之後存儲,儘管我不會期望它。 Find()是supposed可以在開始處(如果沒有先前的匹配)或者在最後一次成功匹配的索引處開始。 UsePattern()爲supposed以保留匹配器在輸入中的位置,並放棄組信息(即,我沒有明確使用)。
我錯過了一些東西,但我不知道是什麼。我懷疑我必須實現這與lookAt()和更新區域(如this example),但我不知道爲什麼這種方法不起作用。
在我的實現中,我使用匹配器在遞歸調用中維護狀態,因此要解決我原來的問題,我保存舊區域並調用區域(oldStart,oldEnd),在設置邊界之前重置匹配器。 – 2011-06-14 18:19:16
該區域與內部「最後」字段不同。您可以測試它:調用find不會更改該區域。 – trutheality 2011-06-14 18:34:57