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

时间:2014-10-14 17:45:04

标签: java regex

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

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

    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!!!

我做错了什么?

2 个答案:

答案 0 :(得分:4)

^默认表示字符串的开头,而不是行的开头。如果您希望它代表该行的开头,则需要将multiline标记添加到正则表达式(?m)

还要考虑在Java 8中使用预见automatically get rid of first empty result in your split array

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

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!

Pre Java 8版本:

如果您需要在旧版本的Java上使用此代码,则需要防止在字符串的开头拆分(以避免第一个元素为空)。为此,您可以在miltiline标志之前使用(?!^)。这种^之前的(?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 :(得分:1)

你的正则表达式应该是\\s{4},而不是^