Regex根据模式拆分字符串,但字符数最少



我想按照以下规则拆分存储在String变量中的长文本:

  1. 在点上拆分(.(
  2. 基板的最小长度应为30(例如(

举个例子:

"The boy ate the apple. The sun is shining high in the sky. The answer to life the universe and everything is forty two, said the big computer."

假设我想要的最小长度是30。

得到的结果是:

  • "男孩吃了苹果。太阳高高地照耀着天空。">
  • "生命、宇宙和一切的答案是四十二,"大电脑说

我不想把"男孩吃了苹果"当作一个片段,因为它不到30个字符。

我想到的两种方式:

  1. 循环所有字符并将它们添加到字符串生成器中。每当我到达一个点(.(时,我会检查我的字符串生成器是否大于最小值,否则我会将其拆分,否则我将继续
  2. 在所有点上拆分(.(,然后在拆分中循环。如果其中一个Splitted字符串小于最小值,我会将其与后面的字符串连接起来

但我正在研究是否可以通过使用Regex在匹配前拆分和测试最小字符数来直接完成这项工作。

感谢

您也可以使用捕获组来匹配您的值,而不是使用split。要使点也与换行符匹配,可以使用Pattern.DOTALL

s*(.{30}[^.]*.|.+$)

在Java中:

String regex = "\s*(.{30}[^.]*\.|.+$)";

解释

  • s*匹配0乘以空白字符
  • (捕获组
    • .{30}匹配任意字符30次
    • [^.]*使用否定字符类匹配0+次非点
    • .按字面匹配
    • |
    • .+$匹配任意字符1+次,直到字符串结束
  • )关闭捕获组

Regex演示| Java演示

不要使用split方法,而是尝试使用以下regexp匹配:S.{29,}?[.]

演示

这应该完成任务:

"W*+(.{30,}?)W*."

测试:https://regex101.com/r/aavcme/3

  • W*+使用与非单词字符一样多的字符来修剪句子之间的空格
  • .匹配任何字符(我想你想匹配句子中的任何类型的字符(
  • {30,}断言匹配的最小长度(30(
  • ?的意思是"尽可能少">
  • .匹配分隔句子的点(假设你总是在句子末尾有一个点,即使是最后一个(

最新更新