如果我正确理解了您的问题,那么这段代码应该可以满足您的要求(但是它假定 maxLenght
等于或大于最长字)
String data = "Hello there, my name is not importnant right now." + " I am just simple sentecne used to test few things.";int maxLenght = 10;Pattern p = Pattern.compile("\G\s*(.{1,"+maxLenght+"})(?=\s|$)", Pattern.DOTALL);Matcher m = p.matcher(data);while (m.find()) System.out.println(m.group(1));输出:
Hellothere, myname isnotimportnantright now.I am justsimplesentecneused totest fewthings.
"\G\s*(.{1,"+maxLenght+"})(?=\s|$)"正则表达式的简短说明:(请记住,Java
d我们需要编写它那样,
"\d"因为我们也需要在字符串文字中对其进行转义)
G
-是表示先前建立的匹配项结尾的锚点,还是表示尚无匹配项(当我们刚开始搜索时)字符串开头(与之相同^
)s*
-代表零个或多个空格(s
代表空格,*
“零个或多个”量词)(.{1,"+maxLenght+"})-让我们将其拆分为更多部分(在运行时:maxLenght
将保留一些数值,如10,因此regex会将其视为.{1,10}).
代表任何字符(实际上默认情况下它可以代表除行分隔符(如n
或)之外的任何字符r
,但是由于有了Pattern.DOTALL
标志,它现在可以代表任何字符- 如果要开始分别分割每个句子,则可以摆脱此方法参数,因为它的开始将无论如何都要换行 ){1,10}-这是一个量词,它使前面描述的元素出现1到10次(默认情况下会尝试查找匹配重复的最大数量),.{1,10}-因此,根据我们刚才所说的,它只代表“ 1到10个字符”(
)
-括号创建组,结构,使我们能够保存匹配的特定部分(此处添加括号后\s*
是因为我们只想在空格后使用部分)
(?=\s|$)
-是一种超前机制,可确保匹配的文本.{1,10}后面有:- 空格(
\s
)
- 空格(
或(写为
|)
* 字符串末尾`$`。
因此,由于
.{1,10}我们最多可以匹配10个字符。但是有了(?=\s|$)它之后,我们要求与匹配的最后一个字符
.{1,10}不属于未完成的单词的一部分(后面必须有空格或字符串的结尾)。


