每四个字符分割一次字符串?

5

我有一个字符串需要分割成等长的子字符串。我找到了这个解决方案,但只适用于字符串长度是4的倍数的情况。

String   myString = "abcdefghijklm";
String[] split = myString.split("(?<=\\G....)");

这将产生以下结果:
[abcd, efgh, ijkl, m]

我需要从字符串的末尾拆分。我期望得到的输出应该像这样:
[a, bcde, fghi, jklm]

我该如何实现这个目标?

可能是将字符串在每个第n个字符处分割的重复问题。 - Ruslan
@Ruslan,这不是链接问题的重复。请查看我的预期输出。 - Trillian
2
应该使用简单的循环完成,而不需要正则表达式。 - anubhava
3个回答

8
这应该可以解决问题:
String[] split = myString.split("(?=(....)+$)");
// or
String[] split = myString.split("(?=(.{4})+$)");

它的作用是这样的:只有当一个空字符串之前有四个字符的倍数直到达到输入末尾时,才会在空字符串上进行分割。
当然,这样的运行时间很慢(O(n^2))。您可以通过自己拆分来获得线性运行时间算法。
如@anubhava所提到的:
(?!^)(?=(?:.{4})+$) 可以避免字符串长度是4的倍数时出现空结果。

1
尝试过了。按照要求得到了 [a, bcde, fghi, jklm] - Ole V.V.
非常感谢。运行正常。 - Trillian
1
(?!^)(?=(?:.{4})+$) 如果字符串长度是4的倍数,则避免返回空结果。 - anubhava
1
感谢大家的改进和解释。 - Trillian

3
正则表达式对于这个问题来说真的不必要。我也认为递归不是解决这个问题的好方法。下面是一个O(n)的解决方案。
public static String[] splitIt(String input, int splitLength){

    int inputLength = input.length();
    ArrayList<String> arrayList = new ArrayList<>();

    int i = inputLength;
    while(i > 0){
        int beginIndex = i - splitLength > 0 ? i - splitLength : 0;
        arrayList.add(0, input.substring(beginIndex, i));
        i -= splitLength;
    }


    return arrayList.toArray(new String[0]);
}

1
不需要使用正则表达式,相反,您可以递归地构建标题字符串列表并返回尾部。
import java.util.*;

public class StringChunker {
    public static void main(String[] args) {
        String str = "abcdefghijklm";

        System.out.println(Arrays.toString(chunk(str, 4)));        // [abcd, efgh, ijkl, m]
        System.out.println(Arrays.toString(chunk(str, 4, true)));  // [a, bcde, fghi, jklm]
    }

    public static String[] chunk(String str, int size) throws IllegalArgumentException {
        return chunk(str, size, false);
    }

    public static String[] chunk(String str, int size, boolean reverse) throws IllegalArgumentException {
        return chunk(str, size, reverse, new ArrayList<String>());
    }

    private static String[] chunk(String str, int size, boolean reverse, List<String> chunks) throws IllegalArgumentException {
        if (size < 1) {
            throw new IllegalArgumentException("size must be greater than 0");
        }
        if (str.length() < size) {
            if (reverse) {
                chunks.add(0, str); // Reverse adds to the front of the list
            } else {
                chunks.add(str); // Add to the end of the list
            }
            return chunks.toArray(new String[chunks.size()]); // Convert to an array
        } else {
            String head, tail;
            if (reverse) {
                head = str.substring(str.length() - size, str.length());
                tail = str.substring(0, str.length() - size);
                chunks.add(0, head);
            } else {
                head = str.substring(0, size);
                tail = str.substring(size);
                chunks.add(head);
            }
            return chunk(tail, size, reverse, chunks);
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接