2012-04-09 13 views
0

私はトークンとしてテキストファイルからテキストを抽出することができるようにしたいが - 例えば、私は文を含むテキストファイルを持っていると言う:テキストファイルからトークンを抽出していますか?

それは良いレストランだ、

は私を信じて!

「トークン」としてこのトークンの内容を抽出したいとします。たとえば、1つのトークンは「それ」、次のトークンは「」、それ以降は「a」、 「良い」、「レストラン」、次に「」、「\ 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

正規表現は確かに解決策ですが、私は1つは完全にあなたがmentionned文字クラスの1で構成さだけ文字列と一致することを考えて...あなたは貪欲な数量を使用し、1それで一連のアルファベット文字が見つかると、それは4つのグループのうちの1つを満たし、それ以外の文字列は無視されます。文字列全体が一致していなくても...私は本当の正規表現の達人ではありません。 – MarioDS

+0

挑戦は、単語の一部とそれ以外のものを定義することです。上の正規表現は、異なるクラスの文字に基づく例です。 「[\\ p {Alpha} \\ '] + | \\ p {Digit} + | \\ p {Punct}のように、アポストロフィのような句読点の一部をアルファベットで結合することができます。 + | \\ p {Space} + "実際、各パターンは単語、数字、空白などのグループ全体と一致する必要があります... – elias

1

あなたのニーズに合ったScannerクラスを見てください。

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

あなたのファイルからスキャナを構築する場合、あなたはあなたのトークンを取得するためにnext()メソッドを使用することができます。

関連する問題