2014-11-02 61 views
0

我是一名Java和正則表達式的初學者程序員,我想創建一個簡單的wordcount程序。速記正則表達式與長版本有何不同?

我在下面的第二個例子中遇到了一些麻煩,我切換到了第一個例子,它工作。第二個不停地匹配同一個單詞(無限的,所以程序的其餘部分不會完成),但第一個工作正確,並計算所有的單詞。我不知道爲什麼。我認爲他們應該是一樣的。

鑑於line是從另一個文件讀取線被wordcounted,wordPattern分開的話,wordListList<String>包含所有的話,再怎麼是下面的代碼:

Matcher match = word.matcher(line); 
while(match.find()) 
    wordList.add(match.group()); 

...與此代碼不同?

while((Matcher match = word.matcher(line)).find()) 
    wordList.add(match.group()); 

感謝您的任何幫助。

(另外,你能幫助我的標題?我不知道叫什麼「速記」的代碼。)

回答

3

在這樣的代碼

while(condition){ 
    body 
} 

condition每次迭代代碼之前被執行以檢查是否應該執行{body}塊。在每次迭代之前第二個例子

while((Matcher match = word.matcher(line)).find()) 
    wordList.add(match.group()); 

的情況下,你正在執行

(Matcher match = word.matcher(line)).find() 

這創造了新的Matcher實例。這裏重要的是這些新實例總是設置爲某種默認狀態。在匹配類的情況下,這個狀態包含了信息,它應該從傳遞字符串的開始處開始匹配(在你的情況下爲line),這樣每個新創建的匹配只能找到第一個匹配。

在你的第一個例子

Matcher match = word.matcher(line); 
while(match.find()) 
    wordList.add(match.group()); 

,因爲您只使用一個實例匹配器,其中每個find後記得最後找到的元素的位置,並且將搜索後下一個的這個問題不存在這個位置。

+0

完全合理。謝謝!我會牢記這一點。 – 2014-11-02 13:54:00

+0

@Jon歡迎您:) – Pshemo 2014-11-02 13:54:40

+0

一種脫離主題,但是有一個名字來結合'Matcher'聲明和'while'循環語句嗎?這對我來說是新的,我認爲它很酷,但我不知道該怎麼稱呼它。 – 2014-11-02 13:55:02