6

我有一些String仅由数字组成的 s,并且我想在字符更改时对其进行拆分。

例如:

  • "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 进行拆分,但这两种方式都看起来很愚蠢。如果有人对更好/更漂亮的方法、正则表达式或逻辑有任何想法,那就太好了。

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 回答