Java 把一段分成几个句子。我是不是在这里打满了所有的基础?

Java 把一段分成几个句子。我是不是在这里打满了所有的基础?,java,regex,Java,Regex,我试图将一个包含多个句子的字符串拆分为一个包含单个句子的字符串数组 这是我到目前为止得到的 String input = "Hello World. " + "Today in the U.S.A., it is a nice day! " + "Hurrah!" + "Here it comes... " + "Party time!"; String array[] = input.sp

我试图将一个包含多个句子的字符串拆分为一个包含单个句子的字符串数组

这是我到目前为止得到的

String input = "Hello World. " 
             + "Today in the U.S.A., it is a nice day! "
             + "Hurrah!"
             + "Here it comes... "
             + "Party time!";
String array[] = input.split("(?<=[.?!])\\s+(?=[\\D\\d])");
我使用
lookback
功能查看句子结尾的标点符号是在某些空格之前还是在单个
空格之前
。如果是这样,我们就分手

但是这个正则表达式并没有涵盖一些例外情况。例如
美国是一个伟大的国家
,被错误地划分为
美国
是一个伟大的国家

你知道我该怎么解决这个问题吗


还有,我是否遗漏了任何边缘情况?

如果不必使用正则表达式,可以使用Java的内置函数

下面的代码显示了解析句子的示例,但是BreakIterator支持其他形式的解析(单词、行等)。如果您使用的是不同的语言,还可以选择在不同的地区传递。此示例使用默认区域设置

String input = "Hello World. " 
    + "Today in the U.S.A., it is a nice day! "
    + "Hurrah!"
    + "The U.S. is a great country. "
    + "Here it comes... "
    + "Party time!";
BreakIterator iterator = BreakIterator.getSentenceInstance();
iterator.setText(input);
int start = iterator.first();
for (int end = iterator.next(); end != BreakIterator.DONE; start = end, end = iterator.next()) {
    System.out.println(input.substring(start, end));
}
这将产生以下输出:

Hello World. 
Today in the U.S.A., it is a nice day! 
Hurrah!
The U.S. is a great country. 
Here it comes... 
Party time!

这是一个相当困难的问题,正如你所遇到的。您是否需要使用regex,或者您是否愿意接受其他解决方案?例如,Java包含一个跨语言环境的代码,您可以尝试捕获结尾标点符号后面跟着一个或多个空格和小写字母的情况。仍然会有一些边缘案例。例如,“美国宪法是一艘大船”。如果没有主要的人工智能,这是不可能的。这是一个个人项目。所以,我没有受到任何限制。我很想听听你的解决方案。
Hello World. 
Today in the U.S.A., it is a nice day! 
Hurrah!
The U.S. is a great country. 
Here it comes... 
Party time!