在Java中每隔三个逗号分割一个String

时间:2013-07-26 22:55:15

标签: java arrays split comma

我有一个看起来像这样的字符串:

0,0,1,2,4,5,3,4,6

我想要返回的是String[],它在每三个逗号后被拆分,所以结果如下:

[ "0,0,1", "2,4,5", "3,4,6" ]

我找到了类似的功能,但它们没有以第n个逗号分开。

4 个答案:

答案 0 :(得分:22)

您可以尝试将split方法与(?<=\\G\\d+,\\d+,\\d+), regex

一起使用

演示

String data = "0,0,1,2,4,5,3,4,6";
String[] array = data.split("(?<=\\G\\d+,\\d+,\\d+),"); //Magic :) 
// to reveal magic see explanation below answer
for(String s : array){
    System.out.println(s);
}

输出:

0,0,1
2,4,5
3,4,6

解释

  • \\d表示一位数,与[0-9]相同,如03
  • \\d+表示一个或多个数字,例如123
  • \\d+,表示其后带逗号的一个或多个数字,例如1,234,
  • \\d+,\\d+,\\d+会接受三个带逗号的数字,例如12,3,456
  • \\G表示最后一场比赛,或者如果没有(如果是第一次使用),则表示字符串的开头
  • (?<=...),positive look-behind,它将匹配逗号,,该逗号(?<=...)之前还有(?<=\\G\\d+,\\d+,\\d+),中描述的字符串
  • ^0,0,1因此会尝试找到前面有三个数字的逗号,并且这些数字之前的字符串是以太开始的(如示例中的2,4,5)或之前匹配的逗号,例如{ {1}}和3,4,6

如果您想使用其他字符,那么您也可以使用其他字符集,例如

  • \\w将匹配字母字符,数字和_
  • \\S一切不是空格的
  • [^,]所有不是逗号的内容
  • ......等等。有关Pattern documentation
  • 的更多信息

顺便说一句,这个表单将在每个第3个,第5个,第7个(以及其他奇数)逗号上使用split,就像split("(?<=\\G\\w+,\\w+,\\w+,\\w+,\\w+),")将在每个第5个逗号分开一样。

要在每个第2,第4,第6,第8(以及偶数数字的其余部分)逗号上拆分,您需要将+替换为{1,maxLengthOfNumber},例如split("(?<=\\G\\w{1,3},\\w{1,3},\\w{1,3},\\w{1,3}),"),以便在每个第4个逗号上拆分当数字可以有最多3位数(0,00,12,000,123,412,999)时。

要分割每个第二个逗号,您还可以根据我的previous answer

使用此正则表达式split("(?<!\\G\\d+),")

答案 1 :(得分:8)

强制性Guava回答:

String input = "0,0,1,2,4,5,3,4,6";
String delimiter = ",";
int partitionSize = 3;

for (Iterable<String> iterable : Iterables.partition(Splitter.on(delimiter).split(s), partitionSize)) {
    System.out.println(Joiner.on(delimiter).join(iterable));
}

输出:

0,0,1
2,4,5
3,4,6

答案 2 :(得分:6)

尝试以下内容:

public String[] mySplitIntoThree(String str) 
{
    String[] parts = str.split(",");

    List<String> strList = new ArrayList<String>();

    for(int x = 0; x < parts.length - 2; x = x+3) 
    {
        String tmpStr = parts[x] + "," + parts[x+1] + "," + parts[x+2];

        strList.add(tmpStr);
    }

    return strList.toArray(new String[strList.size()]);
}

(您可能需要导入java.util.ArrayList和java.util.List)

答案 3 :(得分:3)

编码道场很好!这是我老式的C风格答案:

如果我们调用逗号“部分”之间的位,并将结果从“子串”中分离出来,那么:

n是到目前为止找到的零件数量, i是下一部分的开始, startIndex当前子字符串的开头

迭代零件,每三个部分:切掉一个子串。

当用完逗号时,将结尾的剩余部分添加到结果中。

List<String> result = new ArrayList<String>();
int startIndex = 0;
int n = 0;
for (int i = x.indexOf(',') + 1; i > 0; i = x.indexOf(',', i) + 1, n++) {
    if (n % 3 == 2) {
        result.add(x.substring(startIndex, i - 1));
        startIndex = i;
    }
}
result.add(x.substring(startIndex));