为了账号安全,请及时绑定邮箱和手机立即绑定

在每 4 个字符处拆分一个字符串?

在每 4 个字符处拆分一个字符串?

幕布斯7119047 2022-06-15 09:46:19
我有一个字符串,如果可能的话,我必须将其拆分为长度相等的子字符串。我发现这个解决方案只有在字符串长度是 4 的倍数时才有效。String   myString = "abcdefghijklm"; String[] split = myString.split("(?<=\\G....)");这将产生:[abcd, efgh, ijkl, m]我需要的是拆分“从字符串的末尾”。我想要的输出应该如下所示:[a, bcde, fghi, jklm]我如何实现这一目标?
查看完整描述

3 回答

?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

这应该这样做:


String[] split = myString.split("(?=(....)+$)");

// or

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

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


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


正如@anubhava 所提到的:


(?!^)(?=(?:.{4})+$)如果字符串长度是 4 的倍数,以避免出现空结果


查看完整回答
反对 回复 2022-06-15
?
米脂

TA贡献1836条经验 获得超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]);

}


查看完整回答
反对 回复 2022-06-15
?
HUX布斯

TA贡献1876条经验 获得超6个赞

无需使用正则表达式。相反,您可以递归地构建头部字符串列表并返回尾部。


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);

        }

    }

}


查看完整回答
反对 回复 2022-06-15
  • 3 回答
  • 0 关注
  • 159 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信