使用String.split()提取单词对
鉴于:
String input = "one two three four five six seven";
是否有一个正则表达式可以同时String.split()
抓取(最多)两个单词,例如:
String[] pairs = input.split("some regex");System.out.println(Arrays.toString(pairs));
结果:
[one two, three four, five six, seven]
这个问题是关于 。这与“找到解决方法”或其他“使其以其他方式工作”解决方案 无关 。
回答:
这是你想要的?
(您可以替换\\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
(它将在input
String中具有不同的位置)
。
另外,如果有人想分开说每个第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
以上是 使用String.split()提取单词对 的全部内容, 来源链接: utcz.com/qa/412652.html