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)
,区别为:
- 如果限制为零,那么该模式将被应用尽可能多的次数,数组可以有任何长度,并且尾随的空字符串将被丢弃。
- 如果限制为负数,则该模式将被应用尽可能多的次数,并且数组可以具有任意长度。
如果 ":"
被拆分,它会导致 {"" , ""}
,但空的尾随空格将被丢弃,因此它将 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.
我正在尝试将字符串拆分为字符串数组。我偶然发现了一些对我来说很奇怪的事情。我不明白为什么会这样。
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)
,区别为:
- 如果限制为零,那么该模式将被应用尽可能多的次数,数组可以有任何长度,并且尾随的空字符串将被丢弃。
- 如果限制为负数,则该模式将被应用尽可能多的次数,并且数组可以具有任意长度。
如果 ":"
被拆分,它会导致 {"" , ""}
,但空的尾随空格将被丢弃,因此它将 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.