【问题标题】:Unexpected behavior of Java String split( )Java String split() 的意外行为
【发布时间】:2014-06-01 18:53:33
【问题描述】:

我正在尝试使用字符串拆分函数拆分字符串,这是一个示例:

    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

如您所见,前导空格成为字符串数组中的空元素,但尾随空格不是。

有人知道为什么吗?

【问题讨论】:

  • 因为这正是 javadoc 所说的? docs.oracle.com/javase/6/docs/api/java/lang/… - "此方法的工作原理就像通过使用给定表达式和零限制参数调用双参数拆分方法一样。因此,结果数组中不包含尾随的空字符串。跨度>
  • 是的...我看到@BrianRoach

标签: java parsing split whitespace


【解决方案1】:

您需要使用指定限制的other split method,并指定-1的限制

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

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


编辑(answer for comment):

要修剪前导空格,您可以在拆分String之前去掉前导空格

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

【讨论】:

  • 谢谢@Reimeus!如果我不想要数组中的前导空元素怎么办?是否可以不编写单独的方法来删除前导空格?
【解决方案2】:

来自split documentation

此方法的工作方式类似于通过使用给定表达式和零限制参数调用双参数拆分方法。因此,尾随的空字符串不包含在结果数组中。

所以实际上split(regex)和使用是一样的

split(regex, 0);

它的documentation

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多