簡體   English   中英

Java字符串split()的異常行為

[英]Unexpected behavior of Java String split( )

我正在嘗試使用String split函數拆分字符串,這是一個示例:

    String[] list = "   Hello   ".split("\\s+");
    System.out.println("String length: " + list.length);
    for (String s : list) {
        System.out.println("----");
        System.out.println(s);
    }

這是輸出:

String length: 2
----

----
Hello

如您所見,前導空格在String數組中成為空元素,但尾隨空格不是。

有人知道為什么嗎?

您需要使用另一種拆分方法 ,該方法指定限制並將限制指定為-1

String[] list = "   Hello   ".split("\\s+", -1);

保留尾隨空格-默認行為是按照javadoc省略尾隨空格


編輯( 評論的答案 ):

要修剪前導空間,您可以在分割String之前先去除前導空間

String str = "   Hello   ".replaceAll("^\\s+", "");
String[] list = str.split("\\s+", -1);

來自拆分文檔

該方法的工作方式就像通過調用具有給定表達式且限制參數為0的二參數拆分方法 因此,結尾的空字符串不包括在結果數組中。

所以實際上split(regex)與使用相同

split(regex, 0);

它的文檔

limit參數控制應用圖案的次數,因此會影響所得數組的長度。 如果限制n大於零,則將最多應用n-1次該模式,該數組的長度將不大於n ,並且該數組的最后一個條目將包含除最后一個匹配的定界符之外的所有輸入。 如果n為非正數,則該模式將被盡可能多地應用,並且數組可以具有任何長度。 如果n為零,則該模式將被盡可能多地應用,該數組可以具有任何長度,並且尾隨的空字符串將被丟棄。

因此,如果要包含尾隨空字符串,則只需使用非零值,例如

split("\\s+",10);

但這也將結果數組限制為最多10個元素。 要解決此問題,請使用一些負數,例如

split("\\s+",-1);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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