【问题标题】:Java String's split method ignores empty substringsJava String 的 split 方法忽略空子字符串
【发布时间】:2014-03-01 18:40:13
【问题描述】:

今天突然想到javaString.split()的行为很奇怪。

实际上我想通过.split(",") 将字符串"aa,bb,cc,dd,,,ee" 拆分为数组,从而得到一个长度为7 的字符串数组["aa","bb","cc","dd","","","ee"]

但是当我尝试将字符串 "aa,bb,cc,dd,,,," 拆分为数组时,这给了我一个长度为 4 的数组,这意味着只有 ["aa","bb","cc","dd"] 拒绝所有下一个空白字符串。

我想要一个将像"aa,bb,cc,dd,,,," 这样的字符串拆分为数组["aa","bb","cc","dd","","",""] 的过程。

这可以通过 java.lang.String api 实现吗?提前致谢。

【问题讨论】:

    标签: java regex arrays string split


    【解决方案1】:

    使用带有负数限制的String.split(String regex, int limit)(例如-1)。

    "aa,bb,cc,dd,,,,".split(",", -1)
    

    String.split(String regex) 被调用时,limit = 0 调用它,这将删除数组中所有尾随的空字符串(在大多数情况下,见下文)。

    String.split(String regex) 的实际行为相当令人困惑:

    • 拆分空字符串将生成长度为 1 的数组。空字符串拆分将始终生成包含空字符串的长度为 1 的数组
    • ";"";;;"regex 拆分为";" 将导致一个空数组。 非空字符串拆分将导致数组中所有尾随的空字符串被删除

    至少从 Java 5 到 Java 8 都可以观察到上述行为。

    尝试更改在JDK-6559590 中拆分空字符串时返回空数组的行为。然而,当它在各个地方引起回归时,它很快在JDK-8028321 中被恢复。该更改从未进入 Java 8 的初始版本。

    【讨论】:

    • 这对我不起作用:java -version openjdk version "1.8.0_131" OpenJDK Runtime Environment (build 1.8.0_131-8u131-b11-2ubuntu1.16.04.3-b11)
    • 这太疯狂了……!
    【解决方案2】:

    你可以使用public String[] split(String regex, int limit):

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


    String st = "aa,bb,cc,dd,,,,";
    System.out.println(Arrays.deepToString(st.split(",",-1)));
                                                        ↑
    

    打印:

    [aa, bb, cc, dd, , , , ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-18
      • 2010-10-07
      • 2016-07-30
      • 2013-03-19
      相关资源
      最近更新 更多