今天我发现java String.split()
的行为非常奇怪。
实际上我想通过"aa,bb,cc,dd,,,ee"
将字符串.split(",")
拆分为数组,它给出了一个长度为7的字符串数组["aa","bb","cc","dd","","","ee"]
。
但是当我尝试将一个字符串"aa,bb,cc,dd,,,,"
拆分为数组时,这给了我一个长度为4的数组,意味着只有["aa","bb","cc","dd"]
拒绝所有下一个空白字符串。
我想要一个将"aa,bb,cc,dd,,,,"
之类的字符串拆分为数组["aa","bb","cc","dd","","",""]
的过程。
这可以用java.lang.String api吗?提前谢谢。
答案 0 :(得分:25)
使用带有负限制的String.split(String regex, int limit)
(例如-1)。
"aa,bb,cc,dd,,,,".split(",", -1)
调用String.split(String regex)
时,会调用limit
= 0,这将删除数组中所有尾随的空字符串(大多数情况下,请参见下文)。
String.split(String regex)
的实际行为非常令人困惑:
";"
或";;;"
与regex
";"
分开将导致空数组。 非空字符串拆分将导致删除数组中的所有尾随空字符串。从至少Java 5到Java 8可以观察到上述行为。
在JDK-6559590中拆分空字符串时,尝试更改行为以返回空数组。但是,当它在各个地方引起回归时很快就会在JDK-8028321中恢复。这一变化从未进入最初的Java 8版本。
答案 1 :(得分:4)
您可以使用public String[] split(String regex, int limit)
:
limit
参数控制模式的次数 应用因此会影响结果数组的长度。如果 限制n大于零,那么模式将应用于 大多数n - 1次,数组的长度不会大于n,并且 数组的最后一个条目将包含除最后一个匹配之外的所有输入 分隔符。如果n是非正数,那么该模式将被应用为 尽可能多次,阵列可以有任何长度。如果n为零 那么模式将尽可能多地应用于数组 可以有任何长度,尾随空字符串将被丢弃。
String st = "aa,bb,cc,dd,,,,";
System.out.println(Arrays.deepToString(st.split(",",-1)));
↑
打印:
[aa, bb, cc, dd, , , , ]