Java,将字符串拆分为数组

Java, splitting string into array

我正在尝试将字符串拆分为字符串数组。我偶然发现了一些对我来说很奇怪的事情。我不明白为什么会这样。

   String one, two;
    
    one = "";
    two = ":";
    
    
    String[] devided1 = one.trim().split(":");
    String[] devided2 = two.trim().split(":");
    
    System.out.println("size: "+ devided1.length);
    System.out.println("size: "+ devided2.length);
    

我得到输出:

   size: 1
   size: 0

为什么空字符串给出的大小为 1,而只有分隔符的字符串给出的数组大小为 0? 我看到了更多令人困惑的事情,例如:“::”的大小为 0,但“::”的大小为 2,而不是 3。 有人可以给我解释一下吗?

这个link有帮助:

https://konigsberg.blogspot.com/2009/11/final-thoughts-java-puzzler-splitting.html

基本上是为了perl兼容。

如果您不希望出现这种行为,可以在此处使用 split(":", -1)

否则split(":")默认为split(":", 0),区别为:

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html#split(java.lang.String,int)

  • 如果限制为零,那么该模式将被应用尽可能多的次数,数组可以有任何长度,并且尾随的空字符串将被丢弃。
  • 如果限制为负数,则该模式将被应用尽可能多的次数,并且数组可以具有任意长度。

如果 ":" 被拆分,它会导致 {"" , ""},但空的尾随空格将被丢弃,因此它将 return 一个空数组。

public String[] split(String regex, int limit) 方法参见 doc comment in source code or documentation

案例一:

String one = "";
String[] devided1 = one.trim().split(":");

结果数组将有 1 个元素 = 原始字符串 String[1] [""],因为表达式 ":" 与输入字符串的任何部分都不匹配。

根据文档:

If the * expression does not match any part of the input then the resulting array * has just one element, namely this string.

案例二:

String two = ":";
String[] devided2 = two.trim().split(":");

split(":") 有默认值 limit = 0。这意味着从结果数组 尾随的空字符串 将被删除。因此,方法将 ":" 字符串拆分为包含两个空字符串的数组,然后删除它们,结果我们得到空数组。

根据文档:

If limit is zero then the pattern will be applied as many times as possible, the array can have any length, and trailing empty strings will be discarded.

案例三:

String two = ":";
String[] devided2 = two.trim().split(":", -1);

我们将得到一个包含两个空字符串的数组。

根据文档:

If limit is non-positive then the pattern will be applied as many times as possible and the array can have any length

案例四:

String two = "::";
String[] devided2 = two.trim().split(":");

我们将得到空数组。与案例2.

一样

案例五:

String one = ": :";
String[] devided1 = one.trim().split(":");

该方法会将字符串拆分为三个数组元素 ["", " ", ""],然后从数组末尾删除空字符串,因为 limit = 0。我们将得到 String[2] ["", " "].

根据文档:

If limit is zero then the pattern will be applied as many times as possible, the array can have any length, and trailing empty strings will be discarded.