【Java學習筆記】拾遺

gnuhpc發表於2012-12-17

作者:gnuhpc
出處:http://www.cnblogs.com/gnuhpc/

1.String類是immutable的
一旦String被建立,它的內容就不能被更改了,要想去修改就要新建一個String。StringBuffer類則與String一樣,但是其內容是可以被修改的,它是執行緒安全的。而StringBuilder則與StringBuffer基本一樣,但是它是執行緒不安全的,是輕量級的。它們都在java.lang包中。
2.Java中的正則表達
正則表達在Matcher和Pattern類中使用,都在java.util.regex中,你使用Pattern建立一個正則表達,用Matcher進行匹配。其實在很多String的方法中都支援正則表達。注意在使用正則表達時要處理PatternSyntaxException異常,這個異常是在正則表達語法錯誤時丟擲的。
正則表達可以巢狀,比如 [[abc][012]]就定義了匹配abc或者012的一個模式,但是也可以寫成 [abc012]。而且可以使用邏輯連線符進行連線,例如要匹配所有word字元(所有大小寫,數字0-9,下劃線)但不包含大寫字母的模式,可以寫作 [/w && [^A-Z]]。
注意在Java的正則表達中使用轉義,則使用//來表示一個/,例如/b/w+/b則要在Java中寫作://b//w+//b
匹配器分為三類
第一個是Greedy,也就是以上我們所舉的例子,它匹配最長的部分,試圖搜尋第一個匹配之前讀完(或者說吃掉)整個輸入字串。如果第一個匹配嘗試(整個輸入字串)失敗,匹配器就會在輸入字串中後退一個字元並且再次嘗試,重複這個過程,直到找到匹配或者沒有更多剩下的字元可以後退為止。
而Reluctant則是勉強能夠匹配的一種,又叫Lazy,匹配最短的,使用?建立,採取相反的方式:它們從輸入字串的開頭開始,然後逐步地一次讀取一個字元搜尋匹配。它們最後試圖匹配的內容是整個輸入字串。
第三種叫做 possessive ,這種匹配方式與Greedy方式相似,所不同的是它不夠聰明,當它一口吃掉所有可以吃的字元時發現不匹配則認為整個串都不匹配,它不會試著吐出幾個。它的行為和大地主相似,貪婪但是愚蠢,所以名曰強佔的。 使用+建立。
例如, “simple sample” ,用模式 s.+e 則匹配整個字串。其中.為除換行符以外的任意字元,而+則表示一個或多個,.+就表示其中有一個或多個除換行符以外的任意字元。這是Greedy。
s.+?e 則會匹配    simple,這匹配了最短的字串。
s.++e 則不會匹配任何字串,因為.++匹配了所有s以後的字元,這讓e不知所配,而導致匹配失敗。
組的應用:
I had one dog, but he had two dogs.
She had a cat, but did she want more cats?
She also has a dog. But his dogs were bigger.
我們想匹配單複數名詞,但是不願意在兩個句子中進行匹配。例如,我們匹配dog和dogs,cat和cats,但是第三個句子是兩個句子之間才匹配的。所以我們不匹配那個句子。怎麼寫呢?
我們就用到了Group組:/b(/w+)/b[^.?!]*?/1s
/b為字元邊界, (/w+)則代表了一個組,這個組包含一個單詞。[^.?!]代表不包含標點符號(.或?或!)。*?表示重複任意次,但儘可能少重複。/1為那個組,s則意味著那個單詞的複數形式

 

 

作者:gnuhpc
出處:http://www.cnblogs.com/gnuhpc/

               作者:gnuhpc
               出處:http://www.cnblogs.com/gnuhpc/
               除非另有宣告,本網站採用知識共享“署名 2.5 中國大陸”許可協議授權。


分享到:



相關文章