繁体   English   中英

Java字符串split()的异常行为

[英]Unexpected behavior of 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数组中成为空元素,但尾随空格不是。

有人知道为什么吗?

您需要使用另一种拆分方法 ,该方法指定限制并将限制指定为-1

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

保留尾随空格-默认行为是按照javadoc省略尾随空格


编辑( 评论的答案 ):

要修剪前导空间,您可以在分割String之前先去除前导空间

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

来自拆分文档

该方法的工作方式就像通过调用具有给定表达式且限制参数为0的二参数拆分方法 因此,结尾的空字符串不包括在结果数组中。

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

split(regex, 0);

它的文档

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

因此,如果要包含尾随空字符串,则只需使用非零值,例如

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

但这也将结果数组限制为最多10个元素。 要解决此问题,请使用一些负数,例如

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM