将字符串拆分成句子

leb*_*lev 23 java regex split abbreviation

我写了这段代码,分割字符串并将其存储在字符串数组中: -

String[] sSentence = sResult.split("[a-z]\\.\\s+");
Run Code Online (Sandbox Code Playgroud)

但是,我添加了[az],因为我想处理一些缩写问题.但后来我的结果显示如下: -

此外,当埃弗雷特试图在基础数学中指导他们时,他们证明了他们没有回应

我看到我丢失了split函数中指定的模式.我可以失去这段时间,但丢掉这个词的最后一个字母会扰乱它的意思.

有人可以帮助我吗,此外,有人可以帮我处理缩写吗?例如,因为我根据句点分割字符串,所以我不想丢失缩写.

Jul*_*and 52

解析句子远非一项微不足道的任务,即使对于像英语这样的拉丁语言也是如此.像你在问题中概述的那种天真的方法经常会失败,在实践中它将被证明是无用的.

更好的方法是使用配置了正确Locale 的BreakIterator.

BreakIterator iterator = BreakIterator.getSentenceInstance(Locale.US);
String source = "This is a test. This is a T.L.A. test. Now with a Dr. in it.";
iterator.setText(source);
int start = iterator.first();
for (int end = iterator.next();
    end != BreakIterator.DONE;
    start = end, end = iterator.next()) {
  System.out.println(source.substring(start,end));
}
Run Code Online (Sandbox Code Playgroud)

得到以下结果:

  1. 这是一个测试.
  2. 这是TLA测试.
  3. 现在有了博士.

  • 当我用这句话时 - "我的朋友,琼斯先生,有一只新狗." 由于琼斯的资本化,它在先生发生之后就破裂了.你知道解决方法吗?否则BreakIterator很棒! (8认同)

Mar*_*ers 11

在所有情况下都很难使正则表达式工作,但为了解决您的直接问题,您可以使用lookbehind:

String sResult = "This is a test. This is a T.L.A. test.";
String[] sSentence = sResult.split("(?<=[a-z])\\.\\s+");
Run Code Online (Sandbox Code Playgroud)

结果:

This is a test
This is a T.L.A. test.
Run Code Online (Sandbox Code Playgroud)

请注意,有些缩写不以大写字母结尾,例如缩写,先生等等.而且还有一些句子不会以句号结尾!