我有包含一些数据的文本文件。所有段落都以四个空格开头。我的目的是将这段文字分成几段。
首先,我使用以下方法阅读全文:
public String parseToString(String filePath) throws IOException{
return new String(Files.readAllBytes(Paths.get(filePath)), StandardCharsets.UTF_8);
}
Run Code Online (Sandbox Code Playgroud)
然后我使用此代码拆分字符串:
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]);
}
}
Run Code Online (Sandbox Code Playgroud)
我的输入文件是:
Hello, World!
Hello, World!
Run Code Online (Sandbox Code Playgroud)
输出是:
Paragraph:
Paragraph: Hello, World!!!
Hello, World!!!
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
^默认情况下代表字符串的开始,而不是行的开始。如果你想让它代表行的开始,你需要multiline在你的 regex 中添加标志(?m)。
还可以考虑使用前瞻,它在 Java 8 中会自动摆脱拆分数组中的第一个空结果。
所以试试这个正则表达式:
private static final String PARAGRAPH_SPLIT_REGEX = "(?m)(?=^\\s{4})";
Run Code Online (Sandbox Code Playgroud)
要在字符串的开头或结尾删除不需要的分隔符,如空格或换行符,您可以简单地使用trim类似的方法
public static void parseText(String text) {
String[] paragraphs = text.split(PARAGRAPH_SPLIT_REGEX);
for (String paragraph : paragraphs) {
System.out.println("Paragraph: " + paragraph.trim());
}
}
Run Code Online (Sandbox Code Playgroud)
例子:
String s =
" Hello, World!\r\n" +
" Hello, World!\r\n" +
" Hello, World!";
parseText(s);
Run Code Online (Sandbox Code Playgroud)
输出:
Paragraph: Hello, World!
Paragraph: Hello, World!
Paragraph: Hello, World!
Run Code Online (Sandbox Code Playgroud)
Java 8 之前的版本:
如果您需要在旧版本的 Java 上使用此代码,则需要防止在字符串开头拆分(以避免第一个元素为空)。为此,您可以(?!^)在 miltiline 标志之前使用。这种方式^之前(?m)仍然只能表示字符串的开头,而不是行的开头。或者更明确地说\A,无论多行标志如何,您都可以使用which 代表字符串的开头。
所以前 Java 8 版本的正则表达式看起来像
private static final String PARAGRAPH_SPLIT_REGEX = "(?!^)(?m)(?=^\\s{4})";
Run Code Online (Sandbox Code Playgroud)
或者
private static final String PARAGRAPH_SPLIT_REGEX = "(?m)(?!\\A)(?=^\\s{4})";
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5484 次 |
| 最近记录: |