2012-04-09 152 views
0

我希望能夠從文本文件中提取文本作爲令牌 - 例如,說我有一個包含句子的文本文件:從文本文件中提取令牌?

這是一個很好的餐廳,

相信我!

我想提取這個內容作爲「標記」 - 例如,一個標記將是「它是」,下一個標記將是「」,之後的那個將是「一個」,然後「」,然後是「好」,然後是「餐館」,然後是「,」和「\ n」,然後是「相信」,「」,「我」,「!」。所以我猜想一個方法就是令牌不是單詞就是單詞。

這裏是我到目前爲止(我檢查,看看是否該令牌是一個字還是沒有在程序的其他地方,這種方法只是返回的下一個標記):

public Token next() { 
    if (c == -1) { 
     throw new NoSuchElementException(); 
    } 

    Writer sw=new CharArrayWriter(); 
    try { 
     while (c != -1 && Character.isLetter(c)) { 
      sw.write(c); 
      c = r.read(); 
     } 
     while (c != -1 && !Character.isLetter(c)) { 
      c = r.read(); 
     } 
    } catch (IOException e) { 
     c = -1; 
     return null; 
    } 
    return null; 
} 

現在我有將值返回爲'null',因爲我不確定如何使用編寫器將其作爲令牌導出。有沒有人有任何提示?謝謝!

回答

1

我想使用Matcher類的解決方案可以解決您的問題。

Matcher m = Pattern.compile("\\p{Alpha}+|\\p{Digit}+|\\p{Punct}+|\\p{Space}+").matcher("It's a good restaurant, believe me!"); 
while(m.find()) 
    System.out.println(">"+m.group()+"<"); 

也許這個正則表達式不可能是正確的,但你可以建立一個更好的。看到這個模式文檔中:

http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html

+0

正則表達式確實是一個解決方案,但我認爲,一個只會匹配的是完全由你mentionned字符類之一的琴絃......你用貪婪的量詞,和一個語句,所以當它發現一系列字母字符時,它滿足4個組中的一個,而其他字符將被忽略,即使沒有匹配整個字符串...我想,我不是真正的正則表達式大師。 。 – MarioDS 2012-04-09 19:15:38

+0

挑戰在於定義什麼是一個詞的一部分,什麼不是。上面的正則表達式是一個基於不同類型字符的例子。標點符號的一些字符,如撇號,可以加入字母字符中,解決分離問題:「[\\ p {Alpha} \\'] + | \\ p {Digit} + | \\ p {Punct} + | \\ p {空格} +「的確,每個模式都必須匹配整個單詞,數字,空格等...... – elias 2012-04-09 19:47:15