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

我使用以下代码:

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

我得到ArrayIndexOutofBoundexception。 String.split()如何处理连续或尾随/开始分隔符?

另见

  • 分裂方法存在疑问
  • Java split()方法最后会删除空字符串?

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] + "\""); } 

输出:

值0:“”
价值1:“”
价值2:“”

从J2SE API手册 :

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

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

如果您想确保超过三个条目,您应该使用:

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

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

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

也许这样吗?

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

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

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

使用splittime.length函数查找长度