正则表达式可在模式上分割字符串,但字符数最少

时间:2018-11-06 14:08:39

标签: java regex string split

我想按照这些规则拆分存储在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个字符。

我想到的2种方式:

  1. 浏览所有字符,然后将它们添加到“字符串”构建器中。并且每当到达点(。)时,我都会检查我的String生成器是否大于分割的最小值,否则我将继续。
  2. 在所有点(。)上分割,然后遍历分割。如果Splitted字符串之一小于最小值,则将其与之后的字符串连接起来。

但是我正在寻找是否可以通过使用正则表达式直接分割并测试比赛前最少字符数来完成此操作。

谢谢

3 个答案:

答案 0 :(得分:1)

除了使用split之外,您还可以使用捕获组来匹配值。 要使点也与换行符匹配,可以使用Pattern.DOTALL

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

在Java中:

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

说明

  • \s*匹配0_次空白字符
  • (捕获组
    • .{30}匹配任意字符30次
    • [^.]*使用否定的字符类匹配0+次而不是一个点
    • \.字面上匹配
    • |
    • .+$匹配任意字符1次以上,直到字符串结尾。
  • )关闭捕获组

Regex demo | Java demo

答案 1 :(得分:0)

这应该可以完成工作:

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

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

  • \W*+占用非单词字符以修剪句子之间的空格
  • .可以匹配任何字符(我想您想匹配句子中的任何字符)
  • {30,}声明匹配的最小长度(30)
  • ?的意思是“尽可能少”
  • \.与分隔句子的点匹配(假设您在句子的末尾总是有一个点,即使最后一个也是如此)

答案 2 :(得分:0)

而不是使用 split 方法,请尝试使用以下正则表达式进行 matching \S.{29,}?[.]

Demo