我有一个很长的文字,我试着在每3个句子后打破它。
示例
来源:
"Sentence 1. Sentence 2? Sentence 3! Sentence 4. Sentence 5. Sentence 6. Sentence 7. Sentence 8. Sentence 9. Sentence 10."
应该返回:
"Sentence 1. Sentence 2? Sentence 3!
Sentence 4. Sentence 5. Sentence 6.
Sentence 7. Sentence 8. Sentence 9.
Sentence 10."
目前我的正则表达式(?<=[\.?!])\s
匹配句子之间的所有空格。所以我可以使用它来拆分String然后迭代以添加换行符:
String[] splits = src.split(regex);
StringBuilder b = new StringBuilder();
int index = 0;
for (String s : splits) {
if (index == 3) {
b.append("\n");
index = 0;
} else if (index > 0) {
b.append(" ");
}
b.append(s);
index++;
}
String res = b.toString();
但我想自动使用:
src.replaceAll(regex2, "\n");
我知道如何实现这一目标吗?
答案 0 :(得分:6)
您可以使用以下正则表达式替换:
s = s.replaceAll("(?s)(.*?[.?!](?:\\s.*?[.?!]){0,2})\\s*", "$1\n");
请参阅regex demo
<强>详情
(?s)
- DOTALL修饰符(.
现在匹配换行符)(.*?[.?!](?:\s.*?[.?!]){0,2})
- 第1组:
.*?[.?!]
- 任意0个字符,尽可能少,最左边的.
,?
或!
后跟(?:\s.*?[.?!]){0,2}
- 0到2个序列
\s
- 空白.*?[.?!]
- 任意0个字符,尽可能少,最左边的.
,?
或!
\s+
- 一个或多个空格除了最后一个空格之外,$1\n
替换将获取整个匹配,并在最后添加换行符。