1

我有这个大文本(读大)。我需要标记每个单词,分隔每个非字母。我使用 StringTokenizer 一次读取一个单词。但是,当我正在研究如何编写分隔符字符串(“每个非字母”)而不是执行以下操作时:

new StringTokenizer(text, "\" ();,.'[]{}!?:”“…\n\r0123456789 [etc etc]");

我发现每个人基本上都讨厌 StringTokenizer(为什么?)。

那么,我可以用什么代替呢?不要建议 String.split 因为它会复制我的大文本。我需要逐字阅读文本并为每个非字母定界。我自己构建东西更容易还是有一些最佳实践方法来解决这个问题?

提前致谢!

4

5 回答 5

3

StringTokenizer,根据文档"StringTokenizer is a legacy class that is retained for compatibility reasons although its use is discouraged in new code. It is recommended that anyone seeking this functionality use the split method of String or the java.util.regex package instead."这几乎总结了 StringTokenizer 的仇恨。

如果内存确实是一个问题,您可以逐个字符地遍历字符串和分隔符之间的子字符串,进行处理,然后继续。

于 2012-04-07T08:19:33.353 回答
2

您可以使用Google 的库中的灵活字符串Splitter类。

如果您需要更强大的功能,请查看 Apache Lucene 的StandardTokenizer。从文档:

对于大多数欧洲语言文档,这应该是一个很好的标记器:

  • 在标点符号处拆分单词,删除标点符号。但是,后面没有空格的点被视为标记的一部分。
  • 在连字符处拆分单词,除非标记中有数字,在这种情况下,整个标记被解释为产品编号并且不被分割。
  • 将电子邮件地址和 Internet 主机名识别为一个标记。
于 2012-04-07T09:28:49.920 回答
1

如果你的语法很复杂,你的文件很大,你可以考虑使用JavaCC

当我遇到你的情况时,我会使用它。

于 2012-04-07T08:36:09.683 回答
0

Scanner.class 逐字(或逐行)读取,可用于大文件(或输入流)。

正则表达式的模式可以检测空间和许多东西(看看 § 你可以在哪里找到类似 \p{..}

于 2012-04-07T15:52:05.080 回答
-1

我从来都不是正则表达式的粉丝,但我看不出仅仅使用"[^a-zA-Z]"StringTokenizer 有什么问题。

于 2012-04-07T08:27:33.530 回答