Java報錯系列——split

來源:互聯網
上載者:User

標籤:java split

前言

在Java項目中,比如我們經常使用String的split方法對文本進行處理;在Map/Reduce中,我們也需要對HDFS檔案讀取後對line進行分割,也涉及到split。前幾天,本來“好好的”程式,突然在split處報錯,後來才知道由於有一條“髒資料”導致split“超出”了預期,才導致了“不可能發生的異常”就這樣發生了~不過也說明了一些基礎知識真的很重要,於是把String類的split源碼閱讀了下,發現一個“小小的”split也挺多內容的。


String中的split

在String中,split方法如下:


650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6E/57/wKiom1V5V4vB-UifAABPIVl1KsA500.jpg" style="float:none;" title="string0.png" alt="wKiom1V5V4vB-UifAABPIVl1KsA500.jpg" />


650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6E/53/wKioL1V5WTKw1LVgAABipXk0ufk248.jpg" style="float:none;" title="string1.png" alt="wKioL1V5WTKw1LVgAABipXk0ufk248.jpg" />

可見,split的核心在於Pattern.compile(regex).split(this, limit);


Java提供Pattern,Matcher用於支援正則,可以看一個例子:


650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6E/57/wKiom1V5WHjQ18udAAEmAHAt7yY052.jpg" title="string3.png" alt="wKiom1V5WHjQ18udAAEmAHAt7yY052.jpg" />


運行結果是:

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成了幾部分,我們只需要一部分呢?

如果分成的部分中有“”Null 字元串,split又是如何處理的?



我們可以帶著這些問題來看看源碼:


650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6E/54/wKioL1V5XurQ1CqfAAJMp4wDURg874.jpg" title="string4.png" alt="wKioL1V5XurQ1CqfAAJMp4wDURg874.jpg" />


650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6E/54/wKioL1V5Yt3QNxZ5AAIHWzkZ2QE768.jpg" title="string5.png" alt="wKioL1V5Yt3QNxZ5AAIHWzkZ2QE768.jpg" />


首先來看,limit對matchLimited的影響:


limit < 0 或者 split(regex)等價於split(regex,0)  ==>  matchLimited:false

limit > 0                           ==>  matchLimited:true



其實,while的意思就是說,如果limit>0的話,matchList只加入有限的內容。

如果整個文本沒有匹配上,那麼返回一個長度為1,內容為其本身的數組。

如果limit為0,那麼會將最後匹配的那些空串刪除掉直至非空串為止在返回結果。




結論

在實際應用中,我們一般使用這樣的:

str.split(",")    此時limit=0,只需要注意會去掉最後的空串即可 

str.split(",",-1)  此時會保留最後的空串

str.split(",",2)   限制匹配的個數,同時保留最後的空串






本文出自 “努力奮鬥” 部落格,請務必保留此出處http://zhangfengzhe.blog.51cto.com/8855103/1661091

Java報錯系列——split

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.