将字符串拆分为句子

2022-09-01 15:01:15

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

String[] sSentence = sResult.split("[a-z]\\.\\s+");

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

此外,当埃弗雷特试图指导他们基础数学时,他们被证明是没有反应的。

我看到我丢失了拆分函数中指定的模式。对我来说,失去句点是可以的,但是失去这个词的最后一个字母会扰乱它的含义。

有人可以帮助我吗,另外,有人可以帮助我处理缩写吗?例如,由于我根据句点拆分字符串,因此我不想丢失缩写。


答案 1

解析句子远非一件小事,即使对于像英语这样的拉丁语也是如此。像你在问题中概述的那种天真的方法会经常失败,以至于在实践中被证明是无用的。

更好的方法是使用配置了正确区域设置的 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));
}

产生以下结果:

  1. 这是个测试。
  2. 这是一个T.L.A.测试。
  3. 现在有一个博士在里面。

答案 2

很难让正则表达式在所有情况下都起作用,但是要解决眼前的问题,您可以使用一个查看:

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

结果:

This is a test
This is a T.L.A. test.

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