[英]Java .split method matches empty string weird behaviour
我想從字符序列中獲取數字列表(即:字母和數字)。 所以我寫了這段代碼:
class A {
public static void main(String[] args) {
String msg = "aa811b22";
String[] numbers = msg.split("\\D+");
for (int i = 0; i < numbers.length; i++) {
System.out.println(">" + numbers[i] + "<");
}
}
}
超越它運行......:
$ java A
><
>811<
>22<
好吧,所以不知何故它匹配空字符串...我向自己解釋說""
(空字符串)實際上匹配NON DIGIT MATCHER
表達式\\D+
。 什么都不是數字......對吧? (但是...為什么它只返回1個空字符串?任何字符串中都有無限(∞)個空字符串)
為了確保自己,我嘗試從上面給出的字符串中提取單詞:
class A {
public static void main(String[] args) {
String msg = "aa811b22";
String[] words = msg.split("\\d+");
for (int i = 0; i < words.length; i++) {
System.out.println(">" + words[i] + "<");
}
}
}
這實際上打印了我所期望的(沒有返回空字符串):
$ run A
>aa<
>b<
但是......我做了幾個讓我完全糊塗的測試:
System.out.println("a".split("\\D+").length);
#=> 0 (WHY NOT 1? Empty string shouldn't be here?!)
System.out.println("a1".split("\\D+").length);
#=> 2 (So now it splits to empty string and 1)
System.out.println("1a".split("\\D+").length);
#=> 1 (now it returns expected "a" string)
所以我的問題是:
"a".split("\\\\D+").length
返回0? "a1".split("\\\\D+").length
為2(但沒有人) "1a".split("\\\\D+").length)
如何分裂? "a1".split("\\\\D+").length)
? 'a'
不是數字,所以aa
是分隔符。 在分隔符的兩側有返回的元素,空字符串在a
的左側。 如果分隔符是","
,那么在字符串",a,b"
你會期望3個元素 - ""
, "a"
和"b"
。 在這里, aa
是分離的,就像,
在我的例子。
"a".split("\\\\D+").length
返回0? 'a'
不是數字,所以它是一個分隔符。 隔板的存在意味着有兩個子串分割出原始的String
,兩個空字符串,在任一側a
。 但是, no-arg split
方法會丟棄尾隨空字符串。 它們都是空的,所以它們都被丟棄了, length
為0
。
"a1".split("\\\\D+").length
是2(但不是一個) 僅丟棄尾隨空字符串,因此元素為""
和"1"
。
"1a".split("\\\\D+").length
從"a1".split("\\\\D+").length
是否分裂? "1a"
將丟棄一個尾隨空字符串,但"a1"
將不會丟棄尾隨空字符串(它處於領先位置)。
它不匹配空字符串。 相反,它匹配字符串開頭的"aa"
作為分隔符。 第一個元素為空,因為在第一個分隔符之前只有一個空字符串。 相反,對於尾隨分隔符,沒有返回空字符串,如split()文檔中所述:
此方法的作用就像通過調用具有給定表達式和limit參數為零的雙參數split方法一樣。 因此,結尾的空字符串不包含在結果數組中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.