每4个字符分割一个字符串?

时间:2019-02-11 18:42:10

标签: java regex string split

我有一个字符串,如果可能的话,我必须将其分成相等长度的子字符串。我发现此解决方案仅在字符串长度为4的倍数时才有效。

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

这将产生:

[abcd, efgh, ijkl, m]

我需要的是从字符串末尾拆分。我想要的输出应如下所示:

[a, bcde, fghi, jklm]

我该如何实现?

3 个答案:

答案 0 :(得分:6)

这应该做到:

String[] split = myString.split("(?=(....)+$)");
// or
String[] split = myString.split("(?=(.{4})+$)");

它的作用是:仅在空字符串前面有4个字符的倍数时才对空字符串进行拆分,直到达到输入结束为止。

当然,这有一个不好的运行时(O(n ^ 2))。只需将其自己拆分即可获得线性运行时间算法。

如@anubhava所述:

  

(?!^)(?=(?:.{4})+$)可以避免在字符串长度为4的倍数的情况下出现空结果

答案 1 :(得分: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]);
}

答案 2 :(得分: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);
        }
    }
}