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

使用正则表达式JAVA将文本拆分为段落,java,regex,Java,Regex,我有一个包含一些数据的文本文件。所有段落都以四个空格开头。我的目标是把这篇文章分成几段 首先,我使用以下方法阅读全文: public String parseToString(String filePath) throws IOException{ return new String(Files.readAllBytes(Paths.get(filePath)), StandardCharsets.UTF_8); } 然后我使用以下代码拆分字符串: p

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

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

    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]);
        }
    }
输出为:

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

我做错了什么?

您的正则表达式应该是
\\s{4}
开头没有
^

^
默认情况下表示字符串的开头,而不是行的开头。如果您想让它代表行的开始,您需要将标志添加到正则表达式
(?m)

也考虑使用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上使用此代码,则需要防止在字符串的开头拆分(以避免第一个元素为空)。要做到这一点,您可以在miltiline标志之前使用
(?!^)
。这样,
^
之前的
(?m)
仍然只能表示字符串的开头,而不能表示行的开头。或者更明确地说,您可以使用表示字符串开头的
\A
,而不考虑多行标志

因此,Java8之前版本的正则表达式看起来像

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


你的预期输出是什么?逐行阅读。然后使用正则表达式。文档:
^
在这里是必要的,否则我们也会在段落内的四个空格上分开(我假设这样的文本是可能的,尽管可能性不大)。另外,
\\s
表示行分隔符,这意味着我们可以最终将像
foo\r\n\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuubar“
(有4个空格由
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu/code>表示)这样的文本拆分为
“\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。
private static final String PARAGRAPH_SPLIT_REGEX = "(?!^)(?m)(?=^\\s{4})";
private static final String PARAGRAPH_SPLIT_REGEX = "(?m)(?!\\A)(?=^\\s{4})";