输入:
Hi. I am John.
My name is John. Who are you ?
输出:
Hi
I am John
My name is John
Who are you
答案 0 :(得分:6)
String line = "Hi. My name is John. Who are you ?";
String[] sentences = line.split("(?<=[.!?])\\s+");
for (String sentence : sentences) {
System.out.println("[" + sentence + "]");
}
这会产生:
[Hi.]
[My name is John.]
[Who are you ?]
如果您不习惯使用split
(即使它是“旧版”java.util.StringTokenizer
的推荐替代品),您只能使用 {{3} (这足以完成这项工作)。
这是一个使用Scanner
的解决方案,顺便提一下implements Iterator<String>
。对于额外的教学价值,我还展示了使用Scanner vs. StringTokenizer vs. String.Split的示例,以便您可以使用for-each构造。
final String text =
"Hi. I am John.\n" +
"My name is John. Who are you ?";
Iterable<String> sentences = new Iterable<String>() {
@Override public Iterator<String> iterator() {
return new Scanner(text).useDelimiter("\\s*[.!?]\\s*");
}
};
for (String sentence : sentences) {
System.out.println("[" + sentence + "]");
}
打印:
[Hi]
[I am John]
[My name is John]
[Who are you]
如果这个正则表达式仍然不是你想要的,那么我建议你花时间去教育自己,这样你就可以自己动手了。
注意:上述代码段中的局部变量final
的{{1}}修饰符是必需的。在一个说明性示例中,它创建了一个简洁的代码,但在实际代码中,您应该将匿名类重构为自己的命名类,并在构造函数中使用text
。