2016-09-30 57 views
1

我正在閱讀有這種模式的文件:(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"); 
    } 
} 

太打印錯誤消息。爲什麼?!

好吧,奇怪的事情發生了,現在我再次運行這個小程序,錯誤消失了,但它仍然在我的大程序中。

回答

0

如果匹配器找到的最後一個字符串位於輸入的末尾,似乎Matcher.hitEnd()方法返回true。因此,如果您的文件的最後一部分後面有字符,則Matcher.hitEnd()將返回false,即使它實際上是最後一部分。

但是,我運行了你的測試代碼,它沒有顯示錯誤信息。你確定你發佈了與你的測試相同的代碼嗎?您使用的匹配器不是您首先初始化的匹配器('loopMatcher'vs'匹配器')。

+0

也許我沒有解釋清楚。我實際上使用掃描儀在線上操作,而不是真的有一個類部分。模式是S1,S2,S3,S1,S2,S3 ......當我的readSection3()結束時,我應該進入下一個循環並讀取下一個S1,如果有的話。所以如果最後一個S3和下一個S1在同一條線上,我需要從停止的地方開始。這就是爲什麼我要通過我的匹配器,因爲它應該留在最後一個S3的最後一個標記。當我進入下一個循環並調用readSection1()時,我調用matcher.find(),Matcher應該找到屬於section1的下一個標記。 – HM9527

+0

你說得對,我的代碼中有錯字,現在應該運行。但等等,我試着再次運行它,現在一切都很好?????什麼??????我只是用一個全球匹配器來解決這個問題!!!如果它在40分鐘???? – HM9527

+0

但是,如果我不使用固定版本,我的其他程序仍然出錯...嗯,讓我再次通過這一步。 – HM9527