使用正则表达式在JAVA中将文本拆分为段落

3
我有一个包含一些数据的文本文件。所有段落都以四个空格开头。我的目标是将这个文本分成段落。
首先,我使用以下命令读取整个文本:
    public String parseToString(String filePath) throws  IOException{
        return new String(Files.readAllBytes(Paths.get(filePath)), StandardCharsets.UTF_8);
    }

然后我使用这段代码来分割字符串:
    private static final String PARAGRAPH_SPLIT_REGEX = "(^\\s{4})";
    public void parseText(String text) {
        String[] paragraphs = text.split(PARAGRAPH_SPLIT_REGEX);
        for (int i = 0; i < paragraphs.length; i++) {
            System.out.println("Paragraph: " + paragraphs[i]);
        }
    }

我的输入文件是:
    Hello, World!
    Hello, World!

"输出结果是:"
Paragraph: 
Paragraph: Hello, World!!!
    Hello, World!!!

我做错了什么?

你期望的输出是什么? - Avinash Raj
逐行阅读它,然后使用正则表达式。文档:http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html - Aditya Peshave
2个回答

5

^ 默认表示字符串的开头,而不是行的开头。如果你想要它表示行的开头,你需要在你的正则表达式 (?m) 中添加 multiline 标志。

还可以考虑使用 Java 8 中的先行断言,它会自动 去掉分割数组中的第一个空结果

所以请尝试使用这个正则表达式:

private static final String PARAGRAPH_SPLIT_REGEX = "(?m)(?=^\\s{4})";

为了去除字符串开头或结尾的不必要分隔符,例如空格或换行符,您可以简单地使用trim方法,例如:
public static void parseText(String text) {
    String[] paragraphs = text.split(PARAGRAPH_SPLIT_REGEX);
    for (String paragraph : paragraphs) {
        System.out.println("Paragraph: " + paragraph.trim());
    }
}

例子:

 String s = 
        "    Hello, World!\r\n" + 
        "    Hello, World!\r\n" + 
        "    Hello, World!";
 parseText(s);

输出:

Paragraph: Hello, World!
Paragraph: Hello, World!
Paragraph: Hello, World!

Java 8之前的版本:

如果你需要在旧版Java上使用这段代码,那么你需要防止在字符串开头处分割(避免得到第一个元素为空)。为此,你可以在多行标志之前使用(?!^)。这样,(?m)前面的^仍然只表示字符串的开始,而不是行的开始。或者更明确地,你可以使用\A代表字符串的开始,无论是否设置了多行标志。

因此,Java 8之前的正则表达式可以如下所示:

private static final String PARAGRAPH_SPLIT_REGEX = "(?!^)(?m)(?=^\\s{4})";

或者

private static final String PARAGRAPH_SPLIT_REGEX = "(?m)(?!\\A)(?=^\\s{4})";

1
你的正则表达式应该是\\s{4},开头不要加上^

这里需要使用 ^,否则我们也会在段落内的四个空格上分割(我假设这样的文本是可能的,尽管不太可能)。此外,\\s代表行分隔符,这意味着我们可能会将类似于foo\r\n____bar"(其中有4个由_表示的空格)的文本分割为"foo""__bar",因为\\s{4}也消耗了\r\n。使用^可以防止正则表达式这样做。 - Pshemo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接