8

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

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

我想要返回的是String[]在每 3 个逗号之后拆分的一个,因此结果如下所示:

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

我发现了类似的功能,但它们不会以第 n 个逗号分隔。

4

4 回答 4

23

您可以尝试使用split带有(?<=\\G\\d+,\\d+,\\d+),正则表达式的方法

演示

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表示最后一个匹配,或者如果没有(在第一次使用的情况下)字符串的开头
  • (?<=...),肯定的后视,它将匹配在它之前,也有一些字符串描述的逗号(?<=...)
  • (?<=\\G\\d+,\\d+,\\d+),所以会尝试查找前面有三个数字的逗号,并且这些数字前面有字符串的以太网开头(如^0,0,1您的示例中)或以前匹配的逗号,如2,4,5and 3,4,6

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

  • \\w这将匹配字母字符、数字和_
  • \\S所有不是空白的东西
  • [^,]所有不是逗号的东西
  • ... 等等。模式文档中的更多信息

顺便说一句,这种形式适用于每隔 3 个、5 个、7 个(和其他奇数)逗号split("(?<=\\G\\w+,\\w+,\\w+,\\w+,\\w+),")拆分一次,就像每隔 5 个逗号拆分一次一样。

要在每个第 2、第 4、第 6、第 8(和其余偶数)逗号上拆分,当数字最多可以有 3 位数字(0、00、12、000、123 +、412、999)。{1,maxLengthOfNumber}split("(?<=\\G\\w{1,3},\\w{1,3},\\w{1,3},\\w{1,3}),")

要拆分每个第二个逗号,您还可以split("(?<!\\G\\d+),")根据我之前的回答使用这个正则表达式

于 2013-07-26T23:04:41.597 回答
8

强制性番石榴答案:

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
于 2013-07-26T23:44:12.347 回答
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)

于 2013-07-26T23:16:50.797 回答
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));
于 2013-07-26T23:25:55.823 回答