在String中,split方法如下:
可見,split的核心在于Pattern.compile(regex).split(this, limit);
Java提供Pattern,Matcher用于支持正則,可以看一個例子:
運行結果是:
0,1
||
3,4
|ab|
7,8
|cef|
8,9
||
11,12
|kk|
13,14
|a|
需要注意的是:
通過Pattern給定一個模式(regex),Matcher可以不斷(find)匹配文本,并能找到每
一個匹配上的內容的開始(start),結束(end)索引【結束索引說白了,就是start+匹配
文本的長度】。
subSequence(begin,end)是一個“包頭不包尾”的方法
問題:
在上面的while中,我們能到達的最大的索引處,就是最后一個end,而注意到很有可能
這個end之后還有內容,那么該如何處理呢?
如果一個正則將文本split成了幾部分,我們只需要一部分呢?
如果分成的部分中有“”空字符串,split又是如何處理的?
我們可以帶著這些問題來看看源碼:
首先來看,limit對matchLimited的影響:
limit < 0 或者 split(regex)等價于split(regex,0) ?==> ?matchLimited:false
limit > 0 ? ? ? ? ? ? ? ? ? ? ? ? ? ==> ?matchLimited:true
其實,while的意思就是說,如果limit>0的話,matchList只加入有限的內容。
如果整個文本沒有匹配上,那么返回一個長度為1,內容為其本身的數組。
如果limit為0,那么會將最后匹配的那些空串刪除掉直至非空串為止在返回結果。