次のような文字列があります。
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
説明
\\d
0
または[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,5
andなど) を持っています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));