2014-02-05 16 views
9

今天發生在我身上的java String.split()的行爲很奇怪。Java String的拆分方法忽略空子串

其實我想.split(","),讓我長7

的字符串數組["aa","bb","cc","dd","","","ee"]分割字符串"aa,bb,cc,dd,,,ee"數組但是當我試圖將一個字符串"aa,bb,cc,dd,,,,"分成數組這給了我長度爲4的數組意味着只有["aa","bb","cc","dd"]拒絕所有下一個空白字符串。

我想要一個將"aa,bb,cc,dd,,,,"這樣的字符串拆分爲數組["aa","bb","cc","dd","","",""]的過程。

這是可能的java.lang.String api?提前致謝。

回答

24

使用具有負限制(例如-1)的String.split(String regex, int limit)

"aa,bb,cc,dd,,,,".split(",", -1) 

String.split(String regex)被調用時,它被稱爲與limit = 0,這將消除在陣列中所有尾隨空字符串(在大多數情況下,見下文)。

String.split(String regex)的實際行爲是相當混亂:

  • 分割一個空字符串將導致長度的數組1. 空字符串分割將總是導致在包含空字符串長度1陣列。
  • 分裂";"";;;"regex";"將導致一個空數組。 非空字符串拆分將導致刪除數組中的所有尾隨空字符串

上面的行爲可以從至少爪哇5到Java 8.

被觀察有改變行爲JDK-6559590分割一個空字符串時返回一個空數組的嘗試。然而,當它在各個地方引起倒退時,它很快在JDK-8028321中得到了回覆。這個改變永遠不會使它成爲最初的Java 8版本。

+0

這不是爲我工作:Java的版本 OpenJDK的版本 「1.8.0_131」 OpenJDK的運行時環境(建1.8.0_131-8u131- b11-2ubuntu1.16.04.3-b11) – AlexC

+0

@亞歷克斯:哪些工作不具體? – nhahtdh

+0

這是狂野的......! –

4

可以使用public String[] split(String regex, int limit)

limit參數控制在該模式是 施加的數目,並因此影響所得陣列的長度。如果 的限制值n大於零,那麼該模式將在 之前應用最多n-1次,該陣列的長度將不會大於n,並且該陣列的最後一個條目將包含超出最後匹配的 定界符的所有輸入。如果n是非正值,那麼該模式將盡可能多地應用爲 ,並且該數組可以具有任意長度。如果n爲零 那麼該模式將盡可能多地應用,數組 可以具有任何長度,並且尾隨的空字符串將被丟棄。


String st = "aa,bb,cc,dd,,,,"; 
System.out.println(Arrays.deepToString(st.split(",",-1))); 
                ↑ 

打印:

[aa, bb, cc, dd, , , , ]