我有一个文本文件,我将其读入 Java 应用程序,然后逐行计算其中的单词数。现在我用
将这些行分成单词String.split([\\p{Punct}\\s+])"
但我知道我遗漏了文本文件中的一些单词。例如,单词“can't”应该被分成两个单词“can”和“t”。
逗号和其他标点符号应完全忽略并被视为空格。我一直在尝试了解如何形成更精确的正则表达式来执行此操作,但在这方面我是新手,所以我需要一些帮助。
对于我所描述的目的来说,什么是更好的正则表达式?
你的正则表达式中有一个小错误。试试这个:
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
但是
我
知道
对于
例子
词
可以
t
应该
应该满足您的要求。
作为替代方案,您可以使用
String[] Res = Text.split("\\P{L}+");
\\P{L}
表示不是具有“Letter”属性的 unicode 代码点
有一个非单词文字,
\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
尝试:
line.split("[\\.,\\s!;?:\"]+");
or "[\\.,\\s!;?:\"']+"
这是以下字符之一的或匹配:
., !;?:"'
(请注意,其中有一个空格,但没有 / 或 \)+ 导致多个字符一起算作一个。
这应该给你足够的准确性。 更精确的正则表达式需要更多有关需要解析的文本类型的信息,因为 ' 也可以是单词分隔符。大多数标点符号单词分隔符都在空格周围,因此
[\\s]+
上的匹配也将是一个近似值。 (但对简短的引用给出了错误的计数,例如:她说:“不”。)
如果你从 Kotlin 来到这里
sentence.split(Regex("[\\\p{Punct}\\\s]+"))