将java中的字符串拆分为固定长度的块

时间:2012-06-28 10:01:24

标签: java string split

我在一个名为string1到string7的程序中有七个字符串。

每个字符串的大小为30个字符。

我将获得一个未知长度的输入字符串。

我必须将此输入字符串拆分为30个char字符串,然后将第一个子字符串设置为string1,将第二个字符串设置为string2,依此类推,直到可能为止。如果输入字符串大于210个字符,则结尾处的剩余字符串将被忽略。

当输入字符串的大小小于210 char时,如何处理这种情况。

例如145在这种情况下,string1到string4将是full,而string5将由剩余的15个char组成。

如何很好地处理这个问题?

我可以通过char读取char并将前30个char和string1放在string2中,然后将所有char消耗掉。

但有更好的方法吗?

10 个答案:

答案 0 :(得分:10)

如果您可以使用第三方库,Guava这是just

Iterable<String> chunks = Splitter.fixedLength(30).split(string);

这可以转换为List<String>,例如Lists.newArrayList

(披露:我向Guava捐款。)

答案 1 :(得分:4)

由于您的字符串不在数组或列表中,因此需要明确指定它们。

    Matcher m = Pattern.compile(".{1,30}").matcher(s);
    String s1 = m.find() ? s.substring(m.start(), m.end()) : "";
    String s2 = m.find() ? s.substring(m.start(), m.end()) : "";
    String s3 = m.find() ? s.substring(m.start(), m.end()) : "";
    String s4 = m.find() ? s.substring(m.start(), m.end()) : "";
    String s5 = m.find() ? s.substring(m.start(), m.end()) : "";
    String s6 = m.find() ? s.substring(m.start(), m.end()) : "";
    String s7 = m.find() ? s.substring(m.start(), m.end()) : "";

答案 2 :(得分:3)

private static Collection<String> splitStringBySize(String str, int size) {
    ArrayList<String> split = new ArrayList<>();
    for (int i = 0; i <= str.length() / size; i++) {
        split.add(str.substring(i * size, Math.min((i + 1) * size, str.length())));
    }
    return split;
}

答案 3 :(得分:2)

这应该有用:

 String str = "11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111";
        if (str.length() > 210)
        {
            str =  str.substring(0, 209);
        }
        String newStr  = str.replaceAll("(.{30})", "$1|");
        System.out.println(newStr);
        String[] newStrings = newStr.split("\\|");

它的作用是它接受给定的字符串,并且每30个字符,它会抛出一个分隔符。在这种情况下,我假设您已经知道用户将输入什么以及什么不是,以便您可以投入用户不会输入的分隔符(或分隔符组)。一旦我这样做,我使用我刚刚添加的分隔符拆分字符串。

答案 4 :(得分:2)

如何使用char数组拆分字符串,创建一个通用方法,接收要考虑的块大小和最大大小,并返回一个String数组?

public class SplitStringIntoFixedSizeChunks {

    public static String[] Split(String text, int chunkSize, int maxLength) { 
        char[] data = text.toCharArray();       
        int len = Math.min(data.length,maxLength);
        String[] result = new String[(len+chunkSize-1)/chunkSize];
        int linha = 0;
        for (int i=0; i < len; i+=chunkSize) {
            result[linha] = new String(data, i, Math.min(chunkSize,len-i));
            linha++;
        }
        return result;
    }

    public static void main(String[] args) { 
        String x = "flskdafsld~fdsakçkçfsda sfdaldsak~çfdskkfadsçlkçfldskçlflçfdskçldksçlkfdslçakafdslçdsklçfdskçlafdskçkdfsçlkfds~çlkfasdçlçfdls~kçlf~dksçlsakdçlkfç";
        System.out.println("x length: "+x.length());
        String[] lines = Split(x, 30, 210);
        for (int i=0; i < lines.length; i++) {
            System.out.println("lines["+i+"]: (len: "+lines[i].length()+") : "+lines[i]);
        }
    }
}

此示例结果:

x length: 145
lines[0]: (len: 30) : flskdafsld~fdsakçkçfsda sfdald
lines[1]: (len: 30) : sak~çfdskkfadsçlkçfldskçlflçfd
lines[2]: (len: 30) : skçldksçlkfdslçakafdslçdsklçfd
lines[3]: (len: 30) : skçlafdskçkdfsçlkfds~çlkfasdçl
lines[4]: (len: 25) : çfdls~kçlf~dksçlsakdçlkfç

答案 5 :(得分:1)

这可能会对你有帮助。

public static void main(String args[]) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String st = br.readLine();
            int len = st.length();
            String[] str = new String[7];
            len=len/30;
            int i=0;
            for(; i<7 && i<len; i++  ){
                str[i] = st.substring(30*i, 30*(i+1));
                System.out.println(str[i]);
            }
            if(i!=7){
                str[i] = st.substring(30*i, st.length());
                System.out.println(str[i]);
                }

        }

答案 6 :(得分:1)

我遇到了一个特定用法的问题。用户将M $ Word内容复制/粘贴到HTML字段中,最终通过此技术将其分割为多个数据库字段。

该技术打破了M $ Word使用回车和其他ASCII字符。 REGEX将拆分每个回车而不是指定数量的字符。为了纠正这个问题,我将Michael Besteck的代码修改为以下内容:

Matcher m = Pattern.compile(".{1,30}", Pattern.DOTALL).matcher(s);
String s1 = m.find() ? s.substring(m.start(), m.end()) : "";
String s2 = m.find() ? s.substring(m.start(), m.end()) : "";
String s3 = m.find() ? s.substring(m.start(), m.end()) : "";
String s4 = m.find() ? s.substring(m.start(), m.end()) : "";
String s5 = m.find() ? s.substring(m.start(), m.end()) : "";
String s6 = m.find() ? s.substring(m.start(), m.end()) : "";
String s7 = m.find() ? s.substring(m.start(), m.end()) : "";

这正确地解释了ASCII字符。

答案 7 :(得分:0)

这就是我所做的。似乎工作。如果我在任何地方都错了,请评论:

package com.mypackage;

import java.util.ArrayList;
import java.util.List;


public class TestClass {

public static List<String> splitEqually(final String text, final int size) {

    List<String> ret = new ArrayList<String>((text.length() + size - 1) / size);
    for (int start = 0; start < text.length(); start += size) {

        if (start + size > 0) {

            String temp = text.substring(start, Math.min(text.length(), start + size));
            int length = temp.length();

            for (int i = 0; i < (size - length); i++) {
                temp = temp + " ";
            }

            ret.add(temp);

        } else {
            ret.add(text.substring(start, Math.min(text.length(), start + size)));
        }


    }
    return ret;
}

public static void main(final String args[]) {

    String input = "hello wo";

    String str1, str2, str3, str4, str5;

    List<String> result = TestClass.splitEqually(input, 3);

    try {
        str1 = result.get(0);
        System.out.println("1: " + result.get(0));

        str2 = result.get(1);
        System.out.println("2: " + result.get(1));

        str3 = result.get(2);
        System.out.println("3: " + result.get(2));

        str4 = result.get(3);
        System.out.println("4: " + result.get(3));

        str5 = result.get(4);
        System.out.println("5: " + result.get(4));

    } catch (IndexOutOfBoundsException e) {
    }

}
}

答案 8 :(得分:0)

import java.util.ArrayList;


public class Test {

public static void main(String[] args) {

    // your input
    String input = "";

    // strings 1-7 as array list
    ArrayList<String> results = new ArrayList<String>();

    int length;

    if(input.length() > 210) {

        length = 210;

    } else {

        length = input.length();

    }

    for(int i = 0; i <= length; i += 30) {

        if((length - (i + 30)) > 0) {

            results.add(input.substring(i, i + 30));

        } else {

            results.add(input.substring(i, length));

        }

    }

    for(int a = 0; a < results.size(); a++) {

        System.out.println("size: " + results.get(a).length() + " content: " + results.get(a));

    }

    }

    }

答案 9 :(得分:0)

private   Collection<String> splitStringBySize(String strPrm, int sizePrm) {
    ArrayList<String> splitLcl = new ArrayList<>();
    int lLcl=strPrm.length();
    int quantityLcl = lLcl / sizePrm;
    for (int  i = 0; i <  quantityLcl; i++) {
        splitLcl.add(strPrm.substring(i * sizePrm,(i+1) * sizePrm ));
    }
    int tailLcl = lLcl % sizePrm;

    if(tailLcl>0){
        splitLcl.add(strPrm.substring(lLcl-tailLcl,lLcl));
    }
    return splitLcl;
}