2013-03-05 74 views
3

所以我正在寫一個函數parse()來逐行讀取指定的文件,並且我正在使用String.split(正則表達式)函數將行分解爲字符串數組。此外,每個單詞都將傳遞給另一個作爲parse()參數傳遞的函數中包含的HashMap。雖然我瀏覽了Stack Overflow以獲得任何幫助,但我仍然不確定爲什麼我的函數導致我的程序掛起。使用String.split(正則表達式)來分隔空格和標點符號

下面是函數本身:

public void parse(FrequencyCounter counter) throws IOException { 

    BufferedReader fileReader = new BufferedReader(new FileReader(file)); 

    String searchExpression = "[\\p{Space}\\p{Punct}]"; 

    String line; 
    String[] wordList; 

    line = fileReader.readLine(); 

    while (!line.isEmpty()) { 

     wordList = line.split(searchExpression); 

     System.out.println("First value of wordList: " + wordList[0]); 

     for (String each : wordList) { 
      if(each.isEmpty()) 
       break; 

      if(counter.isAnElement(each)) { 
       counter.incrementKey(each); 
      } else { 
       counter.addKey(each); 
      } 
     } 
    } 

    fileReader.close(); 
} 

這樣我就可以進入while循環就好了,但是當詞表的所謂施工後添加一個println()語句,程序無限打印出的空的wordList和程序不會從函數返回。從我的角度來看,我被引導認爲我正在使用的正則表達式並沒有達到我所期望的目標。

爲了詳細說明我需要什麼,正則表達式應該隔離由僅由字母字符組成的單詞。在完美的情況下,連詞或帶連字符的單詞可以完整識別並添加到單詞列表中。但是,我可以接受像「不會」和「二十二」這樣的詞彙,以成爲「贏」,「t」,「二十」和「二」。

作爲一個測試案例,我正在運行一個純文本文件,其中包含Lewis Carroll的詩「Jabberwocky」,儘管這不包含非常困難的非單詞標記。

這是什麼導致了這個問題,我該如何改進這個功能所做的解析?

回答

2

你不改變你的while循環中的字符串line,所以!line.isEmpty()永遠不會得到滿足。

+0

夠公平的。這是我們時常想念的簡單事情,不是? 我修改了部分代碼,如下所示: 'while(fileReader.ready()){ line = fileReader.readLine(); wordList = line.split(searchExpression);' 我想我可以找出其餘部分,我們將會看到。 感謝您的回答! – MarekVarro 2013-03-05 09:35:51

2

[]你定義了一個集合。一套本身不匹配任何東西。你必須把一個量詞放在它後面。例如[\\p{Space}\\p{Punct}]+將匹配標點符號和空格的任意組合不再1.

這裏是一個很好的tutorial

+0

在前面的回答的頂部,這也解決了在我的HashMap中存在非字值的問題。非常感謝! – MarekVarro 2013-03-05 09:38:14

0

原因您無限循環在你的這部分代碼:

 line = fileReader.readLine(); 
     while (!line.isEmpty()) { 

你需要確保你讀的每次時間循環:

 line = fileReader.readLine(); 
     while (!line.isEmpty()) { 
      ... your while loop 
      line = fileReader.readLine(); 
     } 
相關問題