8

次のような文字列があります。

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

私が返したいのは、String[]3 番目のコンマごとに分割された a であるため、結果は次のようになります。

[ "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

説明

  • \\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

また、他の文字を使用したい場合は、数字のように他の文字セットを使用することもできます


ところで、このフォームは 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+),")に基づいてこの正規表現を使用することもできます

于 2013-07-26T23:04:41.597 に答える
3

コーディング道場にいいね!これが私の古き良き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));
于 2013-07-26T23:25:55.823 に答える