如何将字符串拆分为重叠的字符对

时间:2015-07-03 19:43:24

标签: java string split

我需要将一个字符串拆分成两对字符,但这些字符串重叠。例如,我有一个字符串Testing,我想要输出:

[Te, es, st, ti, in, ng]

我尝试了String.split的一些事情,但我得不到正确的输出:

String s = "Testing";
System.out.println(java.util.Arrays.toString(s.split("(?<=\\G..)")));

这让我:

[Te, st, in, g]

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:4)

split只是搜索要拆分的地方,它无法向结果中添加任何新内容。换句话说,你不能像

那样分裂
"abc"` -> "ab", "bc"

因为b只能是一个结果的一部分。

你可以做的是使用Pattern / Matcher组合,它将find一次消耗一个字符,并存储在第二个字符而不消耗它(所以我们需要在这里一些zero-length技术,如look-around mechanism)。我在考虑像

这样的东西
Pattern p = Pattern.compile(".(?=(.))");
Matcher m = p.matcher(yourString);
while(m.find()){
    System.out.println(m.group() + m.group(1));
}

您也可以使用substring(startIncluding, endExcluding)

String data = "Testing";
for (int i=0; i<data.length()-1; i++){
    System.out.println(data.substring(i,i+2));
}

或使用charAt(index)

String data = "Testing";
for (int i = 0; i < data.length() - 1;) {
    System.out.append(data.charAt(i++)).println(data.charAt(i));
}

答案 1 :(得分:1)

正如@pshemo's answer所说,分割会消耗输入,因此您无法从分割的两个部分中的输入中获取给定字符。

但是,这里有一个完成工作的单线解决方案:

Arrays.stream(s.split("")).reduce((a, b) -> {System.out.println(a + b); return b;});