2017-06-19 53 views
2

第一件事,第一,這裏是我的代碼:爲什麼不在此代碼尊重我的最後的分割模式

String line = "Events|1005435529|7021370073||PAGELOAD|2017-06-19T12:04:40||JI||ServerHostName|ServerIPAddress|9P2_D2jB9Toct7PDTJ7zwLUmWfEYz6Y4akyOKn2g4CepveMH4wr3!46548593!1497854077121|||||||||||"; 
int offset = line.indexOf("Events"); 
String zeroIn = line.substring(offset); 
String[] jsonElements = zeroIn.split("\\|"); 
System.out.println(Arrays.asList(jsonElements)); 

輸出:

[Events, 1005435529, 7021370073, , PAGELOAD, 2017-06-19T12:04:40, , JI, , ServerHostName, ServerIPAddress, 9P2_D2jB9Toct7PDTJ7zwLUmWfEYz6Y4akyOKn2g4CepveMH4wr3!46548593!1497854077121]` 

我也注意到空間添加到每個數組元素開始。

我的問題是我在字符串line的末尾有將近10個空管道符號,而空管線符號的第一個第二和第三個出現受到尊重,最後一個被錯過並且不加在陣列。我在這裏錯過什麼?

+1

你已經得到了有關空元素的答案。要回答另一個問題,*沒有爲每個數組元素添加額外的空格。它只是*打印*,以提高可讀性。如果您打印單個元素,則會看到開頭處沒有空格。您還可以通過觀察輸出中的第一個元素「事件」來看到這一點。 – domsson

回答

3

split(java.lang.String regex)電話split(java.lang.String regex ,int limit)與參數0

如果n爲零,則該模式將被應用多次,如 可能,陣列可以有任意長度,並且尾隨空串 將被丟棄

您可以通過自己與正值調用此方法(和足夠大,一定要包括所有的記號),以防止空令牌被丟棄:

String[] jsonElements = zeroIn.split("\\|", zeroIn.length()); 

注意:從下面的評論,使用負值的確是一個更好的方式來做到這一點:

String[] jsonElements = zeroIn.split("\\|", -1); 

如果n非POSI然後該模式將被應用多次,其數量可以是 ,並且該數組可以具有任何長度。

+3

由於您引用了文檔,您應該使用負面限制。 – Flown

3

String從類和split方法doc:因此

尾隨空字符串中不包括所得到的陣列英寸

因此,在最後一次出現非空字符串後,其餘的將不會包含在數組中。

1

接受的答案解釋了您在單個字符分隔符上分割的限制。我想我會提供這個答案,如果你需要在你的輸出中保留空標記的能力。如果您使用環視來分割,例如一個回顧後,那麼你最終會得到不同的條目,即使兩個管道都沒有在他們之間:

String line = "Events|1005435529|7021370073||PAGELOAD|2017-06-19T12:04:40||JI||ServerHostName|ServerIPAddress|9P2_D2jB9Toct7PDTJ7zwLUmWfEYz6Y4akyOKn2g4CepveMH4wr3!46548593!1497854077121|||||||||||"; 
String[] parts = line.split("(?<=\\|)"); 
for (String part : parts) { 
    System.out.println(part); 
} 

演示在這裏:

Rextester

+0

我認爲值得一提的是每個部分都會包含它的'|',因爲它不再是分隔符。我也認爲這就是爲什麼最後的部分將被返回(它們不再是空字符串)的原因,而不是不同的條目。 – Aaron

+0

我在很多負載下運行,而作爲您的答案可能會解決我的問題,我認爲添加'多個char'正則表達式會減慢我的程序。我沒有測試過這個,但通過在互聯網上的一般閱讀,大於一個字符長度的分割模式被轉換成與您的答案相同的正則表達式。 – User3

相關問題