16

我正在使用以下代码:

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]);

我得到了ArrayIndexOutofBound例外。如何String.split()处理连续或尾随/打开的分隔符?

另见

4

5 回答 5

25

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

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

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

请注意,这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] + "\"");
}

输出:

值 0:“”
值 1:“”
值 2:“”
于 2009-04-24T12:23:37.920 回答
4

J2SE API 手册

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

所以,如果你传入 " ::" 你会得到一个空数组,因为所有的定界符都在尾随。

如果你想确保你得到的条目超过三个,你应该使用:

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

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

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

于 2009-04-24T12:20:06.023 回答
1

大概是这样?

int ndx = 0;
StringTokenizer t = new StringTokenizer(": : ::::",":");
while (t.hasMoreElements())
{
    System.out.println(String.format("Value %d : %s", ++ndx,t.nextElement()));
}
于 2009-04-24T12:32:21.300 回答
0

使用函数 StringTokenizer 在其中你传递字符串和第二个参数作为分隔符

使用 splittime.length 函数查找长度

于 2009-04-24T12:19:28.130 回答
0

您应该检查 splitTime 数组的长度。

于 2009-04-24T12:21:16.397 回答