Java 按字符计数或非单词字符的最后索引拆分单词

Java 按字符计数或非单词字符的最后索引拆分单词,java,regex,Java,Regex,我有这样的字符串: aaaaaas#aa##aa aaaaa as# aa## aa 我想使用split()和regex来完成这个算法: 获得前5个字符 如果它有一些非单词字符,则剪切到最后一个非单词字符,包括非单词字符 如果没有任何非单词字符,请将其剪切5个字符 从最后一次切割开始重复,直到字符串结束 此示例的返回应如下所示: aaaaaas#aa##aa aaaaa as# aa## aa 甚至可以使用正则表达式和split()?这个 .*([\W]+)\W 给我最后一个非单词

我有这样的字符串:

aaaaaas#aa##aa
aaaaa
as#
aa##
aa
我想使用
split()
和regex来完成这个算法:

  • 获得前5个字符
  • 如果它有一些非单词字符,则剪切到最后一个非单词字符,包括非单词字符
  • 如果没有任何非单词字符,请将其剪切5个字符
  • 从最后一次切割开始重复,直到字符串结束
此示例的返回应如下所示:

aaaaaas#aa##aa
aaaaa
as#
aa##
aa
甚至可以使用正则表达式和
split()
?这个

.*([\W]+)\W
给我最后一个非单词字符的字符(在示例中是
aaaaaa s#aa###
),但如何将其分组到最多5个字符,从上一个匹配的末尾拆分并继续

甚至可以使用正则表达式和
split()

是的,但要完全实现您所描述的内容是相当混乱的。请特别注意,您的规范描述了您想要接受的子字符串,而
split()
在子字符串之间匹配分隔符方面起作用

尽管如此,您仍然可以通过对分隔符模式使用零宽度环视断言来完成这类工作,但事实证明,这需要一个长而难看的正则表达式来准确地实现您的特定需求。最重要的是,5个字符的窗口让事情变得一团糟。Java正则表达式确实支持特殊的
\G
来匹配上一个匹配的尾部边界(如果有),这使得作业成为可能

这是我想到的最好的模式:

(?x) (?<= \\G\\w{5} )
   | (?<= \\G  .{4} \\W )
   | (?<= \\G  .{3} \\W ) (?= \\w )
   | (?<= \\G  .{2} \\W ) (?= \\w{2} | \\w\\z )
   | (?<= \\G  .    \\W ) (?= \\w{3} | \\w{1,2}\\z )
   | (?<= \\G       \\W ) (?= \\w{4} | \\w{1,3}\\z )

(x)代码:)x:(?x)代码:(?x)代码:(?x)代码:(?x)代码:(?x)代码:(?x)代码:(?x)代码:(?x)代码:(?x)代码:(?x)代码:(?x)代码:)输入:)代码:<代码>a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,,然后项目符号2显示“剪切到最后一个非单词字符”,也就是说,
a#a#
。但是你的意思是在
a#
?我(现在已删除的答案)
aa下的操作评论?aa######aa应该输出aaa######aa,因为最后一个单词短于5个字符,对不起,我没有提到。所以我应该加上一句:如果拆分的单词是最后5个字符或更短,那么最后5个字符(所以它们是字符串中的最后一个字符)返回它
老实说,您的问题看起来像。您给了我们一些步骤,但我们仍然不知道重点是什么?也许您正在寻找类似:?