Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何拆分只包含分隔符的字符串?_Java_Regex_Split - Fatal编程技术网

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

Java 如何拆分只包含分隔符的字符串?,java,regex,split,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]); 我得到ArrayIndexO

我正在使用以下代码:

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()

另见


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

使用splittime.length函数从以下位置查找长度

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

因此,如果传入“
”,将得到一个空数组,因为所有分隔符都是尾随的

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

String[] splitTime = sample.split(":", 3);
输入“
”确实会在输出数组中提供三个空字符串


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

您应该检查splitTime数组的长度

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

如果希望有尾随的空字符串,则应使用并传递一个负数作为
limit
参数

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

请注意,这是拆分(aString,0)的同义词。

此方法的工作原理类似于使用给定表达式和零限制参数调用双参数
split
方法。因此,结果数组中不包括尾随的空字符串

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

因此,更正后的代码应该是(假设需要尾随的空字符串):

String sample=“::”;
String[]splitTime=sample.split(“:”,-1);
for(int i=0;i
输出:

Value 0 : "" Value 1 : "" Value 2 : "" 值0:“ 值1:“ 值2:“ 也许是这样

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

关于-ve限制的一点很好,但仍然需要检查数组边界,以防输入中只有一个“:”。错误的建议。StringTokenizer将两个冒号视为一个分隔符。无论如何,StringTokenizer是一个遗留类;建议开发人员改用split()。关于使用splitTime.length:在本例中,长度始终为零。所有“标记”都是零长度字符串,StringTokenizer从不返回空标记。使用“:”:“.split(:”)实际返回一个空数组,而不是两个元素数组。它返回两个标记,每个标记只包含一个空格。但Raja特别询问了只包含分隔符和更多点的字符串。1.使用StringTokenizer时,应始终使用hasMoreTokens()和nextToken(),而不是hasMoreElements()和nextElement()。这些只是为了充实枚举接口。2.没有必要像以前那样使用String.format();像System.out这样的PrintStreams有自己的format()方法,传统主义者还有printf()方法。:-)谢谢Alan,你可能已经猜到了,java不是我的主要语言。然而,我正在努力变得更加熟练。所以我很感谢你的评论。FWIW,StringTokenizer不推荐使用。
int ndx = 0;
StringTokenizer t = new StringTokenizer(": : ::::",":");
while (t.hasMoreElements())
{
    System.out.println(String.format("Value %d : %s", ++ndx,t.nextElement()));
}