当前(最近在Java
14上进行了测试)可以使用split()
,但在现实世界中不要使用此方法,因为它看起来像是基于错误的,因为Java中的后向应该具有明显的最大长度,但是此解决方案使用w+
不遵守此限制的方法,并且仍然可以以某种方式起作用-
因此,如果此错误将在以后的版本中修复,则该解决方案将停止工作。
而是使用Pattern
和Matcher
带有正则表达式的类w+s+w+
(除了更安全之外)还避免了将要继承此类代码的人的维护麻烦(请记住“
始终进行编码,就像最终维护您代码的人是知道您所住地的暴力心理变态者 ”) 。
这是你想要的?
(您可以替换
\w与
\S包括所有非空格字符,但在这个例子中,我会离开
\w,因为它是更容易阅读正则表达式
\w\s,然后
\S\s)
String input = "one two three four five six seven";String[] pairs = input.split("(?<!\G\w+)\s");System.out.println(Arrays.toString(pairs));输出:
[one two, three four, five six, seven]
G是上一场比赛,
(?<!regex)是负向回望。
在
split我们试图
- 查找空间->
\s
- 无法预测的->
(?<!negativeLookBehind)
- 用一句话->
\w+
- 与先前匹配的(空格)->
\G
- 在它之前->
\G\w+
。
一开始我唯一的困惑是它如何在第一个空间工作,因为我们希望忽略该空间。 重要信息是\G
在开始时匹配String的开始^
。
因此,在第一次迭代之前,正则表达式在负向后看起来会像,
(?<!^\w+)并且由于第一个空格 确实
在
^\w+之前,所以它无法匹配拆分。下一个空格将不会出现此问题,因此将对其进行匹配,并且有关该信息的信息(例如其在String中的 _位置_
input)将存储在其中,
\G并稍后在下一个负向后搜索中使用。
因此,对于第三个空格,正则表达式将检查之前是否存在匹配的空格
\G和单词
\w+。由于此测试的结果将是肯定的,因此负向后看不会接受它,因此该空间将不匹配,但是第4个空间将不会出现此问题,因为它之前的空间将与存储在其中的空间相同
\G(它将在
inputString中具有不同的位置)
。
另外,如果有人想分开说每个第3个空格,您可以使用此表单基于@maybeWeCouldStealAVan的答案
input.split("(?<=\G\w{1,100}\s\w{1,100}\s\w{1,100})\s")可以使用更大的值代替100,而该值至少应为String中最长单词的长度。
我只是注意到,如果我们想与每个奇数分开,例如每个3、5、7 ,我们也可以使用
+代替
{1,maxWordLength}String data = "0,0,1,2,4,5,3,4,6,1,3,3,4,5,1,1";String[] array = data.split("(?<=\G\d+,\d+,\d+,\d+,\d+),");//every 5th comma


