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

Sta*_*yuk 3 java regex

我有包含一些数据的文本文件。所有段落都以四个空格开头。我的目的是将这段文字分成几段。

首先,我使用以下方法阅读全文:

    public String parseToString(String filePath) throws  IOException{
        return new String(Files.readAllBytes(Paths.get(filePath)), StandardCharsets.UTF_8);
    }
Run Code Online (Sandbox Code Playgroud)

然后我使用此代码拆分字符串:

    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]);
        }
    }
Run Code Online (Sandbox Code Playgroud)

我的输入文件是:

    Hello, World!
    Hello, World!
Run Code Online (Sandbox Code Playgroud)

输出是:

Paragraph: 
Paragraph: Hello, World!!!
    Hello, World!!!
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Psh*_*emo 5

^默认情况下代表字符串的开始,而不是行的开始。如果你想让它代表行的开始,你需要multiline在你的 regex 中添加标志(?m)

还可以考虑使用前瞻,它在 Java 8 中会自动摆脱拆分数组中的第一个空结果

所以试试这个正则表达式:

private static final String PARAGRAPH_SPLIT_REGEX = "(?m)(?=^\\s{4})";
Run Code Online (Sandbox Code Playgroud)

要在字符串的开头或结尾删除不需要的分隔符,如空格或换行符,您可以简单地使用trim类似的方法

public static void parseText(String text) {
    String[] paragraphs = text.split(PARAGRAPH_SPLIT_REGEX);
    for (String paragraph : paragraphs) {
        System.out.println("Paragraph: " + paragraph.trim());
    }
}
Run Code Online (Sandbox Code Playgroud)

例子:

 String s = 
        "    Hello, World!\r\n" + 
        "    Hello, World!\r\n" + 
        "    Hello, World!";
 parseText(s);
Run Code Online (Sandbox Code Playgroud)

输出:

Paragraph: Hello, World!
Paragraph: Hello, World!
Paragraph: Hello, World!
Run Code Online (Sandbox Code Playgroud)

Java 8 之前的版本:

如果您需要在旧版本的 Java 上使用此代码,则需要防止在字符串开头拆分(以避免第一个元素为空)。为此,您可以(?!^)在 miltiline 标志之前使用。这种方式^之前(?m)仍然只能表示字符串的开头,而不是行的开头。或者更明确地说\A,无论多行标志如何,您都可以使用which 代表字符串的开头。

所以前 Java 8 版本的正则表达式看起来像

private static final String PARAGRAPH_SPLIT_REGEX = "(?!^)(?m)(?=^\\s{4})";
Run Code Online (Sandbox Code Playgroud)

或者

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