2012-08-16 89 views
3

我試圖解析一些管道分隔的記錄。我有這樣的代碼:Java的String.split()刪除尾部空條目

public class Test { 
    public static void main(String[] args) throws Exception { 
     String[] components = "EN|1056209|||KA3NDL|L|||||||||||||||||||||".split("\\|"); 
     System.out.println(java.util.Arrays.toString(components)); 
    } 
} 

你希望它打印:

[EN, 1056209, , , KA3NDL, L, , , , , , , , , , , , , , , , , , , , , ] 

但事實並非如此。它打印:

[EN, 1056209, , , KA3NDL, L] 

訪問components陣列的length屬性顯示其已被正確打印。

有人知道爲什麼這是/解決方法嗎?

編輯:

這工作:

public class Test { 
    public static void main(String[] args) throws Exception { 
     String[] components = "EN|1056209|||KA3NDL|L|||||||||||||||||||||".split("\\|", -1); 
     System.out.println(java.util.Arrays.toString(components)); 
    } 
} 
+2

我不希望它打印出您期望它打印的內容 - absolu管道之間沒有任何關係。 – 2012-08-16 18:05:54

+0

AnthonyGrist,謝謝,我去讀了更近的文檔並弄清楚了。 – 2012-08-16 18:14:30

+0

尼克,而不是以非標準的方式編輯問題和它的標題,爲什麼你不寫一個自己的答案?你甚至可以接受它(延遲之後)。 – 2012-08-16 18:58:01

回答

15

String.split無極限參數下降,從結果數組所有尾隨空Strings。你需要包括一個限制:

String str = "EN|1056209|||KA3NDL|L|||||||||||||||||||||"; 
String[] components = str.split("\\|", -1); 

String.split(String, int)

如果n非正則模式將多次地被應用,陣列可以爲任意長度。如果n爲零,則模式將盡可能多次應用,數組可以有任意長度,並且尾隨的空字符串將被丟棄。

調用String.split(String)等同於調用2個參數的split與的限制。

2

改爲使用split()的雙參數版本。它允許你配置是否返回空字符串。

4

您可以通過限制到split方法使得後端空字符串被保留:

"EN|1056209|||KA3NDL|L|||||||||||||||||||||".split("\\|", -1) 
1

有在看Splitter中的出色番石榴庫:

String input = "EN|1056209|||KA3NDL|L|||||||||||||||||||||"; 
Iterable<String> splitIter = Splitter.on("|").split(input); 
System.out.println(splitIter); 

輸出:

[EN, 1056209, , , KA3NDL, L, , , , , , , , , , , , , , , , , , , , , ]