题
我编写了这片代码,该代码将字符串拆分并将其存储在字符串数组中: -
String[] sSentence = sResult.split("[a-z]\\.\\s+");
但是,我添加了[AZ],因为我想处理一些缩写问题。但是随后我的结果出现了: -
此外,埃弗里特(Everett
我看到我失去了拆分函数中指定的模式。我可以失去这个时期,但是失去了这个词的最后一句话扰乱其含义。
有人可以帮助我,此外,还可以帮助我处理缩写吗?例如,由于我基于周期拆分字符串,所以我不想丢失缩写。
解决方案
即使对于像英语这样的拉丁语言,解析句子远非琐碎的任务。像您在问题中概述的一种天真方法一样,经常会失败,以至于在实践中将被证明是无用的。
更好的方法是使用 断路器 配置为正确的语言环境。
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));
}
产生以下结果:
- 这是一个测试。
- 这是TLA测试。
- 现在有一位博士。
其他提示
在所有情况下,都很难获得正则表达式工作,但是要解决您的直接问题,您可以使用LOWBEHIND:
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.
请注意,有些缩写不会以大写字母的结尾,例如Abbrev。,Mr.等...而且还有一些句子在时期内没有结束!
不隶属于 StackOverflow