2013-02-26 56 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