如何重新格式化段落以使每个句子分开?

Joh*_*ohn 1 text

输入:

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)

pol*_*nts 6

    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构造函数.

也可以看看