我正在閱讀有這種模式的文件:(section1, section2, section3) ...
但格式不能保證,這意味着我必須處理像分隔線上的一個部分,一個線上的許多部分的情況。而且我還需要存儲每個令牌的偏移量。所以我跑這樣的代碼,使用匹配器,因爲它給偏移和令牌:java中的匹配器,while循環中的匹配器行爲?
`define a global matcher
while() {
readSection1(matcher, other parameters);
readSection2(matcher, other parameters);
readSection3(matcher, other parameters);
}
你可以看到,我想通過這個匹配,所以我可以從那裏我停止啓動。但現在我有一個問題。在我上次readSection3方法結束後,我測試了我的匹配器沒有達到最終結果,於是我開始了新一輪的閱讀。 但是,當我再次進入while循環,並將匹配器傳遞給readSection1方法時,匹配器突然終結!爲什麼會發生?
我也辦一個小測試:
String loop = "a b c d e f g h i j k l";
Matcher loopMatcher = Pattern.compile("\\S+").matcher(loop);
boolean loopEnded = false;
while (!loopEnded) {
use(loopMatcher);
if (loopMatcher.hitEnd()) {
loopEnded = true;
}
}
public static void use(Matcher matcher) {
if (!matcher.find()) {
System.out.println("loop not ended but matcher hit end");
}
}
太打印錯誤消息。爲什麼?!
好吧,奇怪的事情發生了,現在我再次運行這個小程序,錯誤消失了,但它仍然在我的大程序中。
也許我沒有解釋清楚。我實際上使用掃描儀在線上操作,而不是真的有一個類部分。模式是S1,S2,S3,S1,S2,S3 ......當我的readSection3()結束時,我應該進入下一個循環並讀取下一個S1,如果有的話。所以如果最後一個S3和下一個S1在同一條線上,我需要從停止的地方開始。這就是爲什麼我要通過我的匹配器,因爲它應該留在最後一個S3的最後一個標記。當我進入下一個循環並調用readSection1()時,我調用matcher.find(),Matcher應該找到屬於section1的下一個標記。 – HM9527
你說得對,我的代碼中有錯字,現在應該運行。但等等,我試着再次運行它,現在一切都很好?????什麼??????我只是用一個全球匹配器來解決這個問題!!!如果它在40分鐘???? – HM9527
但是,如果我不使用固定版本,我的其他程序仍然出錯...嗯,讓我再次通過這一步。 – HM9527