【问题标题】:Java String split inconsistencyJava字符串拆分不一致
【发布时间】:2015-07-20 12:38:28
【问题描述】:

如果我将 "hello|""|hello""|" 字符分开,那么我会得到第一个值以及第二个版本的两个值。

String[] arr1 = new String("hello|").split("\\|");
String[] arr2 = new String("|hello").split("\\|");
System.out.println("arr1 length: " + arr1.length + "\narr2 length: " + arr2.length);

打印出来:

arr1 长度:1
arr2 长度:2

这是为什么?

【问题讨论】:

  • split(String regex) - 此方法的工作方式就像通过使用给定表达式和零限制参数调用双参数拆分方法一样。因此,尾随的空字符串不包含在结果数组中。
  • 也检查this

标签: java string


【解决方案1】:

根据java docssplit 如果第一个字符是分隔符,则创建一个空字符串,但如果最后一个字符(或连续字符)是分隔符,则不会创建一个空字符串(或空字符串)。无论您使用何种分隔符,您都会得到相同的行为。

【讨论】:

  • "无论您使用何种分隔符,您都将获得相同的行为",具体取决于 Java 版本。在 pre 8 中,当我们使用 split("") 时,我们总是在开始时以空字符串结束,但现在(在 Java 8 中)我们不会(与其他零长度正则表达式相同)。
  • @Pshemo 很有趣。我不知道。谢谢。
【解决方案2】:

后面的空字符串不会包含在数组中检查以下语句。

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

【讨论】:

    【解决方案3】:

    String#split 始终返回通过拆分此字符串计算的字符串数组围绕给定正则表达式的匹配项

    【讨论】:

      【解决方案4】:

      查看源代码以获得答案:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/regex/Pattern.java#Pattern.compile%28java.lang.String%29

      最后几行包含答案:

      int resultSize = matchList.size();
      if (limit == 0)
        while (resultSize > 0 && matchList.get(resultSize-1).equals(""))
          resultSize--;
      String[] result = new String[resultSize];
      

      所以如果结尾为空,则不会包含结尾。

      【讨论】:

        猜你喜欢
        • 2011-07-01
        • 2016-11-04
        • 2014-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多