如何拆分仅包含分隔符的字符串?

2022-09-03 05:02:17

我使用以下代码:

String sample = "::";
String[] splitTime = sample.split(":");
// extra detail omitted
System.out.println("Value 1 :"+splitTime[0]);
System.out.println("Value 2 :"+splitTime[1]);
System.out.println("Value 3 :"+splitTime[2]);

我遇到了异常。如何处理连续或尾随/打开分隔符?ArrayIndexOutofBoundString.split()

另请参阅


答案 1

Alnitak 是正确的,默认情况下将丢弃尾随的空字符串。

如果要使用尾随的空字符串,则应使用 split(String, int) 并传递一个负数作为参数。limit

该参数控制应用模式的次数,因此会影响结果数组的长度。如果限制 n 大于零,则模式将最多应用 n - 1 次,数组的长度将不大于 n,数组的最后一个条目将包含除最后匹配的分隔符之外的所有输入。如果 n 为非正数,则模式将尽可能多地应用,并且数组可以具有任何长度。如果 n 为零,则模式将尽可能多地应用,数组可以具有任何长度,并且将丢弃尾随的空字符串。limit

请注意,split(aString) 是以下各项的同义词:split(aString, 0)

此方法的工作方式就像调用具有给定表达式和极限参数为零的双参数方法一样。因此,尾随空字符串不包括在结果数组中。split

此外,您应该使用循环从数组中获取值;这避免了可能的.ArrayIndexOutOfBoundsException

所以你纠正的代码应该是(假设你想要尾随的空字符串):

String sample = "::";
String[] splitTime = sample.split(":", -1);
for (int i = 0; i < splitTime.length; i++) {
    System.out.println("Value " + i + " : \"" + splitTime[i] + "\"");
}

输出:

Value 0 : ""
Value 1 : ""
Value 2 : ""

答案 2

摘自 J2SE API 手册

因此,尾随空字符串不包括在结果数组中。

因此,如果传入 “”,则会得到一个空数组,因为所有分隔符都尾随。::

如果要确保获得的条目不超过三个,则应使用:

String[] splitTime = sample.split(":", 3);

输入为“”时,确实会在输出数组中为您提供三个空字符串。::

但是,如果输入中恰好只有一个“”,那么您的数组中仍然只会得到两个元素。: