输入:
Hi. I am John.
My name is John. Who are you ?
Run Code Online (Sandbox Code Playgroud)
输出:
Hi
I am John
My name is John
Who are you
Run Code Online (Sandbox Code Playgroud)
String line = "Hi. My name is John. Who are you ?";
String[] sentences = line.split("(?<=[.!?])\\s+");
for (String sentence : sentences) {
System.out.println("[" + sentence + "]");
}
Run Code Online (Sandbox Code Playgroud)
这会产生:
[Hi.]
[My name is John.]
[Who are you ?]
Run Code Online (Sandbox Code Playgroud)
如果使用不习惯split(即使它的"遗产"建议更换java.util.StringTokenizer),您可以只使用唯一的 java.util.Scanner(这是绰绰有余做的工作).
这是一个使用的解决方案,Scanner顺便说一下implements Iterator<String>.对于额外的教学价值,我还展示了一个使用示例,java.lang.Iterable<T>以便您可以使用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 + "]");
}
Run Code Online (Sandbox Code Playgroud)
这打印:
[Hi]
[I am John]
[My name is John]
[Who are you]
Run Code Online (Sandbox Code Playgroud)
如果这个正则表达式仍然不是你想要的,那么我建议你花时间教育自己,这样你就可以自己动手了.
注意:上述代码段中final局部变量的修饰符text是必需的.在一个说明性的例子中,它创建了一个简洁的代码,但是在实际的代码中,你应该将匿名类重构为它自己的命名类,并让它接受text构造函数.
| 归档时间: |
|
| 查看次数: |
435 次 |
| 最近记录: |