【问题标题】:Splitting text into paragraphs with regex JAVA使用正则表达式 JAVA 将文本拆分为段落
【发布时间】:2014-10-14 17:45:03
【问题描述】:

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

首先,我阅读全文使用:

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

我做错了什么?

【问题讨论】:

标签: java regex


【解决方案1】:

^ 默认代表字符串的开始,而不是行的开始。如果您希望它代表行的开头,您需要将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!

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})";

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • ^ 在这里是必要的,否则我们也会在段落内分割四个空格(我假设这样的文本是可能的,尽管不太可能)。此外,\\s 表示行分隔符,这意味着我们最终可以将foo\r\n____bar" 之类的文本(_ 表示 4 个空格)拆分为 "foo""__bar",因为 \\s{4} 也消耗了 \r\n。使用^ 可以防止正则表达式这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2019-10-14
    • 2016-08-04
    • 1970-01-01
    • 2022-01-17
    • 2010-11-03
    • 1970-01-01
    相关资源
    最近更新 更多