在java中通过标点符号和空格等正则表达式分割字符串

问题描述 投票:0回答:5

我有一个文本文件,我将其读入 Java 应用程序,然后逐行计算其中的单词数。现在我用

将这些行分成单词
String.split([\\p{Punct}\\s+])"

但我知道我遗漏了文本文件中的一些单词。例如,单词“can't”应该被分成两个单词“can”和“t”。

逗号和其他标点符号应完全忽略并被视为空格。我一直在尝试了解如何形成更精确的正则表达式来执行此操作,但在这方面我是新手,所以我需要一些帮助。

对于我所描述的目的来说,什么是更好的正则表达式?

java regex string split
5个回答
30
投票

你的正则表达式中有一个小错误。试试这个:

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 代码点


16
投票

有一个非单词文字,

\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

0
投票

好吧,看到你想把 can 算作两个词,试试吧

split("\\b\\w+?\\b")

http://www.regular-expressions.info/wordboundaries.html


0
投票

尝试:

line.split("[\\.,\\s!;?:\"]+");
or         "[\\.,\\s!;?:\"']+"

这是以下字符之一的或匹配:

., !;?:"'
(请注意,其中有一个空格,但没有 / 或 \)+ 导致多个字符一起算作一个。

这应该给你足够的准确性。 更精确的正则表达式需要更多有关需要解析的文本类型的信息,因为 ' 也可以是单词分隔符。大多数标点符号单词分隔符都在空格周围,因此

[\\s]+
上的匹配也将是一个近似值。 (但对简短的引用给出了错误的计数,例如:她说:“不”。)


0
投票

如果你从 Kotlin 来到这里

sentence.split(Regex("[\\\p{Punct}\\\s]+"))
© www.soinside.com 2019 - 2024. All rights reserved.