我有一个看起来像这样的字符串:
0,0,1,2,4,5,3,4,6
我想要返回的是String[]
,它在每三个逗号后被拆分,所以结果如下:
[ "0,0,1", "2,4,5", "3,4,6" ]
我找到了类似的功能,但它们没有以第n个逗号分开。
答案 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]相同,如0
或3
\\d+
表示一个或多个数字,例如1
或23
\\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
一切不是空格的[^,]
所有不是逗号的内容顺便说一句,这个表单将在每个第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));