我有一些仅由数字组成的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"}
我想要一个好方法来做这件事。
我知道两种方法:要么强行,要么一节一节地添加。或者,我可以遍历并删除所有的0并用0替换,然后在字符更改时添加0,然后对0进行拆分,但这两种方式看起来都很愚蠢。如果有人对regex或逻辑这一更好/更漂亮的方法有任何想法,那就太好了。
这似乎像您期望的一样工作
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])", "")
删除这些零
尝试
str.split( "0+|(?<=(\d))(?!\1)" )
对于包含零的字符串,您必须遍历数组并移除任何空元素。