我有这样大的文本(读大)。 我需要来标记每一个字,划上的每个非字母。 我用的StringTokenizer一次读一个字。 然而,由于我是研究如何编写分隔字符串(“每一个非字母”),而不是做这样的事情:
new StringTokenizer(text, "\" ();,.'[]{}!?:”“…\n\r0123456789 [etc etc]");
我发现,基本上每个人都痛恨的StringTokenizer(为什么?)。
所以,我可以用呢? 不建议String.split,因为它会重复我的大文本。 我需要的字都要经过文词和界定上的每个非字母。 它是更容易建立的东西在我自己的或者是有一些最佳实践的方式来应对这个问题?
提前致谢!
您可以使用灵活的字符串分离器类是从谷歌的番石榴库。
如果你需要更强大的东西,看看StandardTokenizer Apache的Lucene的。 从文档:
这应该是大多数欧洲语言的文档了良好的标记生成器:
- 在标点符号拆分的话,除去标点符号。 然而,这不是跟空格点被认为是标记的一部分。
- 在连字符分割的话,除非有一些令牌,在这种情况下,整个令牌被解释为产品编号,而不是分裂。
- 确认电子邮件地址和主机名互联网作为一个令牌。
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的恨。
如果记忆是一个真正的关心,你可以遍历字符串字符一个字符和字符串分隔符之间,做你的处理,然后继续前进。
它你的语法是复杂的,你的文件比较大,你可以考虑使用的JavaCC 。
当我在你的情况是我使用它。
Scanner.class读取由字(或逐行)字,并且它可以在大文件(或输入流)一起使用。
模式的正则表达式可以检测空间,很多事情(看§在这里你可以找到像\ p {..}
我从来都不是正则表达式的粉丝,但我看不出什么毛病只是用"[^a-zA-Z]"
对的StringTokenizer。