2014-09-24 64 views
1

我運行下面的程序:拆分在多字符行分隔符使用模式匹配

public class TestClass { 
    public static void main(final String[] args) { 
     String valid = "abc|~abc|~abc|~abc|~abc|~|~|~|~|~|~|~abc"; 
     String invalid = "xyz|~xyz|~xyz|~xyz|~xyz|~|~|~|~|~|~|~"; 
     String delimiter = "|~"; 
     Pattern pattern = Pattern.compile(Pattern.quote(delimiter)); 
     String[] tokensValid = pattern.split(valid); 
     String[] tokensInvalid = pattern.split(invalid); 
     System.out.println("Valid: " + tokensValid.length); 
     System.out.println("InValid: " + tokensInvalid.length); 
    } 
} 

輸出是:

Valid: 12 
InValid: 5 

但我感覺輸出應該是:

Valid: 12 
InValid: 12 

它是如何工作的?

回答

3

one-arg overload of String.split將丟棄所有空的尾隨空令牌。

該方法的工作原理與通過調用給定表達式和極限參數爲零的雙參數拆分方法相同。尾隨的空字符串因此不包含在結果數組中。

你有7個。這就是爲什麼你的「InValid」案件得到5

要獲得12,您必須使用two-arg overload of String.split,並使用負數限制(或至少爲12的限制),它不會丟棄尾隨的空標記。

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

1

split method documentation從(重點煤礦)

此方法類似於調用兩個參數分割方法用給定的輸入序列和零限制參數。 因此尾隨的空字符串不包含在結果數組中。

換句話說分割"xyz|~xyz|~xyz|~xyz|~xyz|~|~|~|~|~|~|~"|~將在開始產生陣列

["xyz","xyz","xyz","xyz","xyz","","","","","","",""] 

但因爲limit參數調用內部split(CharSequence input, int limit)方法設置爲0尾隨空字符串潔具去除,這意味着結果數組你有是

["xyz","xyz","xyz","xyz","xyz"] 

這是長度5.

基於這些方法的文檔

,如果你想避免刪除後空字符串,你可以使用此方法負limit值一樣

String[] tokensInvalid = pattern.split(invalid, -1); 
//            ^^^ 
相關問題