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

时间:2009-04-24 12:09:28

标签: java regex split

我使用以下代码:

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()如何处理连续或尾随/开始分隔符?

另见

5 个答案:

答案 0 :(得分:24)

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

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

  

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

请注意,split(aString)split(aString, 0)的同义词:

  

此方法就像通过使用给定表达式和limit参数为零调用双参数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 : ""

答案 1 :(得分:4)

来自J2SE API manual

  

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

所以,如果你传入“::”,你将得到一个空数组,因为所有的分隔符都在尾随。

如果您想确保不再而不是三个条目,您应该使用:

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

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

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

答案 2 :(得分:1)

或许这样吗?

int ndx = 0;
StringTokenizer t = new StringTokenizer(": : ::::",":");
while (t.hasMoreElements())
{
    System.out.println(String.format("Value %d : %s", ++ndx,t.nextElement()));
}

答案 3 :(得分:0)

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

使用splittime.length函数查找长度

答案 4 :(得分:0)

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