6

数字のみで構成される sがいくつかStringあり、文字が変わるたびに分割したいと考えています。

例えば:

  • "11101100112021120"に行く:{"111", "11", "11", "2", "2", "11", "2"}
  • "222222222"に行く{"222222222"}
  • "222222122"に行く{"222222", "1", "22"}
  • "000000000"に行く{}
  • "0000100000"に行く{"1"}
  • "11121222212112133321"に行く{"111", "2", "1", "2222", "1", "2", "11", "2", "1", "333", "2", "1"}

これをうまくやる方法が欲しい。

私はこれについて 2 つの方法を知っています: 力ずくで強制するか、セクションごとに追加するかです。または、すべての 0 を削除して 0 に置き換え、文字が変更されたときに 0 を追加し、0 で分割することもできますが、これらの方法はどちらもばかげているように見えます。これを行うためのより良い/きれいな方法、正規表現またはロジックについて誰かが考えを持っているなら、それはいいでしょう。

4

2 に答える 2

8

これはあなたが期待するように動作するようです

data.split("0+|(?<=([1-9]))(?=[1-9])(?!\\1)");

テスト:

String[] tests = { "11101100112021120", "222222222", "222222122",
        "000000000", "0000100000", "11121222212112133321" };

for (String data : tests) {
    System.out.println(data + " ->" + Arrays.toString(data.split("0+|(?<=([1-9]))(?=[1-9])(?!\\1)")));
    System.out.println("-----------------------");
}

出力:

11101100112021120 ->[111, 11, 11, 2, 2, 11, 2]
-----------------------
222222222 ->[222222222]
-----------------------
222222122 ->[222222, 1, 22]
-----------------------
000000000 ->[]
-----------------------
0000100000 ->[, 1]     // <-- only problem - empty first element 
-----------------------
11121222212112133321 ->[111, 2, 1, 2222, 1, 2, 11, 2, 1, 333, 2, 1]
-----------------------

残念ながら、先頭にゼロがあると、配列に追加の空の文字列を含めることができます。それを取り除くには、これらのゼロを以前に削除することができますdata.replaceFirst("^0+(?=[^0])", "")

于 2013-02-26T23:55:10.857 に答える
2

試す

 str.split( "0+|(?<=(\\d))(?!\\1)" )

ゼロを含む文字列の場合は、配列を反復処理して空の要素を削除する必要があります。

于 2013-02-26T23:48:32.143 に答える