Java String split()的意外行为

我试图使用String split函数拆分字符串,这是一个例子:

String[] list = " Hello ".split("\\s+"); System.out.println("String length: " + list.length); for (String s : list) { System.out.println("----"); System.out.println(s); } 

这是输出:

 String length: 2 ---- ---- Hello 

如您所见,前导空格在String数组中变为空元素,但尾随空格不是。

有谁知道为什么?

您需要使用另一个指定限制的split方法并指定限制为-1

 String[] list = " Hello ".split("\\s+", -1); 

保留尾随空格, – 默认行为是根据javadoc省略尾随空格


编辑( 回答评论 ):

要修剪前导空格,可以在拆分String之前剥离前导空格

 String str = " Hello ".replaceAll("^\\s+", ""); String[] list = str.split("\\s+", -1); 

从拆分文档

此方法的作用就像通过调用给定表达式和limit参数为零的双参数split方法一样 。 因此,结尾的空字符串不包含在结果数组中。

所以实际上split(regex)与使用相同

 split(regex, 0); 

它的文件说

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

所以如果你想要包含尾随空字符串,就必须使用非零值

 split("\\s+",10); 

但这也会将结果数组限制为最多10个元素。 要摆脱这个问题,请使用一些负数

 split("\\s+",-1);