有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我需要将一个字符串拆分为两个字符对,但这两个字符对重叠。例如,我有一个字符串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) 个答案

  1. # 1 楼答案

    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));
    }
    
  2. # 2 楼答案

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

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

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