鉴于输入始终以0开头,然后如下:
c1 +出现,其中c1是字符,出现是重复相同字符的序列。
例如,aabbaaacccc
变为0a2b2a3c4
,字符将始终为小写a-z。
现在我的问题输入为:
0x1k1c4t11g3d1m1d1j10f1v1n3e2r3i1e2a1h4a2e1y1z2e1s1a1q1j2r1k2t3h1i1f4j1d2m4p3
但是,当我使用String.split()
并迭代结果时,我得到空字符串。我尝试使用split("[0-9]")
和split("[^a-z]")
,但结果不会改变。
我的例子的迭代结果是:
x
k
c
t
g
d
m
d
j
f
v
n
e
r
i
e
a
h
a
e
y
z
e
s
a
q
j
r
k
t
h
i
f
j
d
m
p
这是JDK中的错误还是我的正则表达式有问题?
答案 0 :(得分:1)
这里的问题似乎是你用一个正则表达式分开,它只是一个数字或字符,当你得到一个两位数字时你有一个空字符串,例如t11你得到t1而你松开了最后1,如果你想取整数,你需要在正则表达式寻找后加上+,例如在这种情况下你应该放。 拆分(" [0-9] +")无论您拥有多少位数,您都可以得到整数。
答案 1 :(得分:0)
正如Vulcan在评论中所述,这是由于至少存在两个导致空String的连续数字而引起的。 也许您想首先从String中删除任何数字,或者显然,删除结果数组中的空字符串。 例如:
s = "0x1k1c4t11g3d1m1d1j10f1v1n3e2r3i1e2a1h4a2e1y1z2e1s1a1q1j2r1k2t3h1i1f4j1d2m4p3";
s = s.replaceAll("\\d","");
答案 2 :(得分:0)
在这种情况下,我不认为使用字符串split()
是个好主意。如果你在这种情况下使用substring
和charAt()
会更好,然后尝试考虑一个计算出现次数的循环。
答案 3 :(得分:0)
您需要按零长度模式进行拆分。一个lookahead assertion是非捕获的,是要走的路:
String str = "0d1j10f1";
str.split("(?=[a-z])");
// result: ["0", "d1", "j10", "f1"]
此外,正如其他答案中所指出的,请记住,数字可以是多位数。