2012-04-09 155 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