我将这个文本文件读入Java应用程序,然后逐行计算其中的单词。现在我正在通过
将这些行分成单词String.split([\\p{Punct}\\s+])"
但我知道我错过了文本文件中的一些单词。例如,“不能”这个词应该分为两个词“can”和“t”。
应该完全忽略逗号和其他标点符号,并将其视为空格。我一直试图理解如何形成一个更精确的正则表达式来做到这一点,但我是一个新手,所以我需要一些帮助。
对于我所描述的目的,什么可以是更好的正则表达式?
答案 0 :(得分:20)
你的正则表达式中有一个小错误。试试这个:
String[] Res = Text.split("[\\p{Punct}\\s]+");
[\\p{Punct}\\s]+
将字符类中的+
表单移到外面。另外明智的是你也在+
分裂,并且不要连续组合分裂字符。
所以我得到了这段代码
String Text = "But I know. For example, the word \"can\'t\" should";
String[] Res = Text.split("[\\p{Punct}\\s]+");
System.out.println(Res.length);
for (String s:Res){
System.out.println(s);
}
此结果
10
但
我
知道
对于
例如
该
字
可以
Ť
应该
哪个应符合您的要求。
作为替代方案,您可以使用
String[] Res = Text.split("\\P{L}+");
\\P{L}
表示不是具有“Letter”属性的unicode代码点
答案 1 :(得分:9)
有一个非单词文字,\W
,请参阅Pattern
。
String line = "Hello! this is a line. It can't be hard to split into \"words\", can it?";
String[] words = line.split("\\W+");
for (String word : words) System.out.println(word);
给出
Hello
this
is
a
line
It
can
t
be
hard
to
split
into
words
can
it
答案 2 :(得分:0)
答案 3 :(得分:0)
尝试:
line.split("[\\.,\\s!;?:\"]+");
or "[\\.,\\s!;?:\"']+"
这是其中一个字符的匹配或匹配:., !;?:"'
(请注意,那里有空格但没有/或\)+会导致多个字符一起计为一个字符。
这应该给你一个足够的准确性。
更精确的正则表达式需要有关您需要解析的文本类型的更多信息,因为'也可以是单词分隔符。大多数标点符号的单词分隔符都是在空格周围,所以[\\s]+
上的匹配也是近似的。 (但在短引号上给出了错误的统计数据,例如:她说:“不”。)