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

时间:2011-09-12 07:53:02

标签: java regex string split

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

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

但我知道我错过了文本文件中的一些单词。例如,“不能”这个词应该分为两个词“can”和“t”。

应该完全忽略逗号和其他标点符号,并将其视为空格。我一直试图理解如何形成一个更精确的正则表达式来做到这一点,但我是一个新手,所以我需要一些帮助。

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

4 个答案:

答案 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)

好吧,看到你想算数不能算两个字,试试

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

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

答案 3 :(得分:0)

尝试:

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

这是其中一个字符的匹配或匹配:., !;?:"'(请注意,那里有空格但没有/或\)+会导致多个字符一起计为一个字符。

这应该给你一个足够的准确性。 更精确的正则表达式需要有关您需要解析的文本类型的更多信息,因为'也可以是单词分隔符。大多数标点符号的单词分隔符都是在空格周围,所以[\\s]+上的匹配也是近似的。 (但在短引号上给出了错误的统计数据,例如:她说:“不”。)