簡體   English   中英

Java .split方法匹配空字符串奇怪的行為

[英]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)

所以我的問題是:

  • 為什么split用我給出的例子返回空字符串?
  • 為什么"a".split("\\\\D+").length返回0?
  • 為什么"a1".split("\\\\D+").length為2(但沒有人)
  • "1a".split("\\\\D+").length)如何分裂? "a1".split("\\\\D+").length)
  • 為什么split用我給出的例子返回空字符串?

'a'不是數字,所以aa是分隔符。 在分隔符的兩側有返回的元素,空字符串在a的左側。 如果分隔符是"," ,那么在字符串",a,b"你會期望3個元素 - """a""b" 在這里, aa是分離的,就像,在我的例子。

  • 為什么"a".split("\\\\D+").length返回0?

'a'不是數字,所以它是一個分隔符。 隔板的存在意味着有兩個子串分割出原始的String ,兩個空字符串,在任一側a 但是, no-arg split方法會丟棄尾隨空字符串。 它們都是空的,所以它們都被丟棄了, length0

  • 為什么"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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM