我想按照以下规则拆分存储在String变量中的长文本:
- 在点上拆分(.(
- 基板的最小长度应为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个字符。
我想到的两种方式:
- 循环所有字符并将它们添加到字符串生成器中。每当我到达一个点(.(时,我会检查我的字符串生成器是否大于最小值,否则我会将其拆分,否则我将继续
- 在所有点上拆分(.(,然后在拆分中循环。如果其中一个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(?
的意思是"尽可能少">.
匹配分隔句子的点(假设你总是在句子末尾有一个点,即使是最后一个(