每x个句子后打破一个字符串

时间:2017-10-25 12:26:05

标签: java android regex replaceall

我有一个很长的文字,我试着在每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");

我知道如何实现这一目标吗?

1 个答案:

答案 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替换将获取整个匹配,并在最后添加换行符。