使用正则表达式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})";