2013-02-26 53 views
5

我有一些只有數字的String s,我想在字符改變時分割它。字符更改時拆分字符串。可能的Regex解決方案?

例如:

  • "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"}

我想一個很好的方式來做到這一點。

我知道兩種方法可以解決這個問題:只需強制強制,或者逐節添加。或者,我可以通過並刪除所有的0並替換爲0,然後在字符更改時添加0,然後在0上進行拆分,但這兩種方法都看起來很愚蠢。如果任何人有更好/更漂亮的方式來做到這一點,正則表達式或邏輯,它會很好。

+0

順便說一句,谷歌鏈接表示讚賞。我找不到任何有效的搜索字詞。另外,我將它們保存在一個ArrayList或其他任何簡單的方式訪問它們。 – 2013-02-26 23:39:39

+1

您應該將您的要求更改爲_我有一些只包含數字的字符串,並且我希望在字符changed_ **和數字0 **時分割它以符合您的示例。 – jlordo 2013-02-26 23:51:12

回答

6

這似乎是工作像你期望

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])", "")

+0

完美的作品,非常感謝! – 2013-02-27 00:10:59

+0

awesome ....... – user1428716 2013-02-27 00:12:46

+2

請注意,對於所有零的字符串,執行'replaceFirst(「^ 0+」,「」)'將導致split產生一個帶有一個空字符串的數組。嘗試'replaceFirst(「^ 0 +(?= [^ 0])」,「」)'而不是僅當字符串以零開始時替換,而不是*全部*零。 – matts 2013-02-27 00:18:03

2

嘗試

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

對於含有零串,你將有然後通過陣列進行迭代並刪除任何空元素。

+1

這就像說的那樣,你會有空/空元素,這很好,但是Pshemo的不會產生空的元素,但是非常感謝你! – 2013-02-27 00:10:14