次のような文字列があります。
0,0,1,2,4,5,3,4,6
私が返したいのは、String[]3 番目のコンマごとに分割された a であるため、結果は次のようになります。
[ "0,0,1", "2,4,5", "3,4,6" ]
同様の関数を見つけましたが、n番目のカンマで分割されません。
正規表現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
説明
\\d0または[0-9] と同じ 1 桁を意味します。3\\d+1またはのような1つ以上の数字を意味します23\\d+,1,またはのように、後にコンマが付いた 1 つ以上の数字を意味234, \\d+,\\d+,\\d+のようにコンマで区切られた 3 つの数字を受け入れます12,3,456\\G最後の一致を意味するか、(最初の使用の場合) 一致がない場合は文字列の先頭を意味します(?<=...),肯定的な後読みで、その前に,何らかの文字列が記述されているカンマに一致します(?<=...)(?<=\\G\\d+,\\d+,\\d+),そのため、その前に3つの数字を持つコンマを見つけようとします。これらの数字は、その前に文字列のエーテル開始があるか(^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}),")
2 番目のコンマごとに分割するには、以前の回答split("(?<!\\G\\d+),")に基づいてこの正規表現を使用することもできます
コーディング道場にいいね!これが私の古き良きCスタイルの答えです:
コンマ間のビットを「パーツ」と呼び、結果を「部分文字列」に分割すると、次のようになります。
nはこれまでに見つかった部分の量、
iは次の部分
startIndexの開始点、現在の部分文字列の開始点
3 番目の部分ごとに部分を反復処理します。部分文字列を切り取ります。
コンマが足りなくなったら、最後に残った部分を結果に追加します。
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));