我有包含一些数据的文本文件。所有段落都以四个空格开头。我的目标是将这段文字分成几段。
首先,我使用以下方式阅读全文:
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!!!
我做错了什么?
答案 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}
,而不是^
。