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

时间:2010-04-30 07:27:04

标签: text

输入:

Hi. I am John.
My name is John. Who are you ?

输出:

Hi
I am John
My name is John
Who are you

1 个答案:

答案 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

另见