Pattern和Matcher_第1頁
Pattern和Matcher_第2頁
Pattern和Matcher_第3頁
Pattern和Matcher_第4頁
Pattern和Matcher_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余1頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、java.util.regex 是一個(gè)用正則表達(dá)式所訂制的模式來對字符串進(jìn)行匹配工作的類庫包。1 .簡介:java.util.regex 是一個(gè)用正則表達(dá)式所訂制的模式來對字符串進(jìn)行匹配工作的類庫包。它包括兩個(gè)類:PatternftMatcherPattern 一個(gè) Pattern 是一個(gè)正則表達(dá)式經(jīng)編譯后的表現(xiàn)模式。Matcher 一個(gè) Matcher 對象是一個(gè)狀態(tài)機(jī)器, 它依據(jù) Pattern 對象做為匹配模式對字符串展開匹配檢查。首先一個(gè) Pattern 實(shí)例訂制了一個(gè)所用語法與 PERL 勺類似的正則表達(dá)式經(jīng)編譯后的模式, 然后一個(gè) Matcher 實(shí)例在這個(gè)給定的 Pattern

2、實(shí)例的模式控制下進(jìn)行字符串的匹配工作。以下我們就分別來看看這兩個(gè)類:2 .Pattern 類:Pattern 的方法如下:staticPatterncompile(Stringregex)將給定的正則表達(dá)式編譯并賦予給 Pattern 類staticPatterncompile(Stringregex,intflags)同上,但增加 flag 參數(shù)的指定,可選的 flag 參數(shù)包括:CASEINSENSITIVE,MULTILINE,DOTALL,UNICODE,CACANONEQintflags()返回當(dāng)前 Pattern 的匹配 flag 參數(shù).Matchermatcher(CharSeq

3、uenceinput)生成一個(gè)給定命名的 Matcher 對象staticbooleanmatches(Stringregex,CharSequenceinput)編譯給定的正則表達(dá)式并且對輸入的字用以該正則表達(dá)式為模開展匹配,該方法適合于該正則表達(dá)式只會(huì)使用一次的情況,也就是只進(jìn)行一次匹配工作,因?yàn)檫@種情況下并不需要生成一個(gè) Matcher 實(shí)例。Stringpattern()返回該 Patter 對象所編譯的正則表達(dá)式。Stringsplit(CharSequenceinput)將目標(biāo)字符串按照 Pattern 里所包含的正則表達(dá)式為模進(jìn)行分割。Stringsplit(CharSequen

4、ceinput,intlimit)作用同上,增加參數(shù) limit 目的在于要指定分割的段數(shù),如將 limi 設(shè)為 2,那么目標(biāo)字符串將根據(jù)正則表達(dá)式分為割為兩段。一個(gè)正則表達(dá)式,也就是一申有特定意義的字符,必須首先要編譯成為一個(gè)Pattern 類的實(shí)例,這個(gè) Pattern 對象將會(huì)使用 matcher()方法來生成一個(gè) Matcher實(shí)例,接著便可以使用該 Matcher 實(shí)例以編譯的正則表達(dá)式為基礎(chǔ)對目標(biāo)字符用進(jìn)行匹配工作,多個(gè) Matcher 是可以共用一個(gè) Pattern 對象的。現(xiàn)在我們先來看一個(gè)簡單的例子,再通過分析它來了解怎樣生成一個(gè) Pattern 對象并且編譯一個(gè)正則表達(dá)式,

5、最后根據(jù)這個(gè)正則表達(dá)式將目標(biāo)字符串進(jìn)行分割:復(fù)制代碼代碼如下:importjava.util.regex.*;publicclassReplacementpublicstaticvoidmain(Stringargs)throwsException/生成一個(gè) Pattern,同時(shí)編譯一個(gè)正則表達(dá)式Patternp=Ppile(/+);用 Pattern 的 split()方法把字符串按/分割Stringresult=p.split(KevinhasseenLEONsevealtimes,becauseitisagoodfilm.+/凱文已經(jīng)看過這個(gè)殺手不太冷幾次了,因?yàn)樗且徊?”好電影。/名

6、詞:凱文。);for(inti=0;isevealtimes,becauseitisagoodfilm.凱文已經(jīng)看過這個(gè)殺手不太冷幾次了,因?yàn)樗且徊亢秒娪?。名詞:凱文。很明顯,該程序?qū)⒆址?”進(jìn)行了分段,我們以下再使用 split(CharSequenceinput,intlimit)方法來指定分段的段數(shù),程序改動(dòng)為:tringresult=p.split(KevinhasseenLEONsevealtimes,becauseitisagoodfilm./凱文已經(jīng)看過這個(gè)殺手不太冷幾次了,因?yàn)樗且徊亢秒娪啊?名詞:凱文。,2);這里面的參數(shù)2表明將目標(biāo)語句分為兩段。輸出結(jié)果則為:Kev

7、inhasseenLEONsevealtimes,becauseitisagoodfilm.凱文已經(jīng)看過這個(gè)殺手不太冷幾次了,因?yàn)樗且徊亢秒娪啊?名詞:凱文。由上面的例子,我們可以比較出 java.util.regex 包在構(gòu)造 Pattern 對象以及編譯指定的正則表達(dá)式的實(shí)現(xiàn)手法與我們在上一篇中所介紹的 Jakarta-ORO 包在完成同樣工作時(shí)的差別, Jakarta-ORO 包要先構(gòu)造一個(gè) PatternCompiler 類對象接著生成一個(gè)Pattern 對象,冉將正則表達(dá)式用該 PatternCompiler 類的 compile。方法來將所需的正則表達(dá)式編譯賦予 Pattern

8、類:PatternCompilerorocom=newPerl5Compiler();Patternpattern=pile(REGULAREXPRESSIONS);PatternMatchermatcher=newPerl5Matcher();但是在 java.util.regex 包里,我們僅需生成一個(gè) Pattern 類,直接使用它的 compile()方法就可以達(dá)到同樣的效果:Patternp=Ppile(/+);因此似乎 java.util.regex 的構(gòu)造法比 Jakarta-ORC為簡潔并容易理解。3 .Matcher 類:Matcher 方法如下:MatcherappendR

9、eplacement(StringBuffersb,Stringreplacement)將當(dāng)前匹配子用替換為指定字符用,并且將替換后的子用以及其之前到上次匹配子用之后的字符串段添加到一個(gè) StringBuffer 對象里。StringBufferappendTail(StringBuffersb)將最后一次匹配工作后剩余的字符串添加到一個(gè) StringBuffer 對象里。intend()返回當(dāng)前匹配的子用的最后一個(gè)字符在原目標(biāo)字符串中的索引位置。intend(intgroup)返回與匹配模式里指定的組相匹配的子用最后一個(gè)字符的位置。booleanfind()嘗試在目標(biāo)字符串里查找下一個(gè)匹配子

10、用。booleanfind(intstart)重設(shè) Matcher 對象, 并且嘗試在目標(biāo)字符串里從指定的位置開始查找下一個(gè)匹配的子用。Stringgroup()返回當(dāng)前查找而獲得的與組匹配的所有子用內(nèi)容Stringgroup(intgroup)返回當(dāng)前查找而獲得的與指定的組匹配的子用內(nèi)容intgroupCount()返回當(dāng)前查找所獲得的匹配組的數(shù)量。booleanlookingAt()檢測目標(biāo)字符串是否以匹配的子用起始。booleanmatches()嘗試對整個(gè)目標(biāo)字符展開匹配檢測,也就是只有整個(gè)目標(biāo)字符串完全匹配時(shí)才返回真值。Patternpattern()返回該 Matcher 對象的現(xiàn)

11、有匹配模式,也就是對應(yīng)的 Pattern 對象。StringreplaceAll(Stringreplacement)將目標(biāo)字符串里與既有模式相匹配的子用全部替換為指定的字符申。StringreplaceFirst(Stringreplacement)將目標(biāo)字符串里第一個(gè)與既有模式相匹配的子用替換為指定的字符串。Matcherreset()重設(shè)該 Matcher 對象。Matcherreset(CharSequenceinput)重設(shè)該 Matcher 對象并且指定一個(gè)新的目標(biāo)字符串。intstart()返回當(dāng)前查找所獲子用的開始字符在原目標(biāo)字符串中的位置。intstart(intgroup)

12、返回當(dāng)前查找所獲得的和指定組匹配的子用的第一個(gè)字符在原目標(biāo)字符串中的位置。(光看方法的解釋是不是很不好理解?不要急,待會(huì)結(jié)合例子就比較容易明白了)一個(gè) Matcher 實(shí)例是被用來對目標(biāo)字符串進(jìn)行基于既有模式(也就是一個(gè)給定的Pattern 所編譯的正則表達(dá)式)進(jìn)彳 T 匹配查找的,所有往 Matcher 的輸入都是通過CharSequence 接口提供的,這樣做的目的在于可以支持對從多元化的數(shù)據(jù)源所提供的數(shù)據(jù)進(jìn)行匹配工作。我們分別來看看各方法的使用:matches()/lookingAt()/find():一個(gè) Matcher 對象是由一個(gè) Pattern 對象調(diào)用其 matcher()方法

13、而生成的,一旦該Matcher 對象生成,它就可以進(jìn)行三種不同的匹配查找操作:matches。方法嘗試對整個(gè)目標(biāo)字符展開匹配檢測,也就是只有整個(gè)目標(biāo)字符串完全匹配時(shí)才返回真值。lookingAt()方法將檢測目標(biāo)字符串是否以匹配的子用起始。巾 nd()方法嘗試在目標(biāo)字符串里查找下一個(gè)匹配子用。以上三個(gè)方法都將返回一個(gè)布爾值來表明成功與否。replaceAll()/appendReplacement()/appendTail()Matcher 類同時(shí)提供了四個(gè)將匹配子用替換成指定字符串的方法:replaceAll()replaceFirst()appendReplacement()appendT

14、ail()replaceAll()WreplaceFirst()的用法都比較簡單,請看上面方法的解釋。我們主要重點(diǎn)了解下 appendReplacement()ftappendTail()?!r 法。appendReplacement(StringBuffersb,Stringreplacement)將當(dāng)前匹配子用替換為指定字符串,并且將替換后的子用以及其之前到上次匹配子串之后的字符串段添加至 U 一個(gè)StringBuffer 對象里,而 appendTail(StringBuffersb)方法貝 U 將最后一次匹配工作后剩余的字符串添加到一個(gè) StringBuffer 對象里。例如,有字符串

15、 fatcatfatcatfat,假設(shè)既有正則表達(dá)式模式為cat,第一次匹配后調(diào)用appendReplacement(sb,dog)那么這時(shí) StringBuffersb 的內(nèi)容為 fatdog,也就是 fatcat中的 cat 被替換為 dog 并且與匹配子用前的內(nèi)容加到 sb 里,而第二次匹配后調(diào)用appendReplacement(sb,dog),那么sb的內(nèi)容就變?yōu)閒atdogfatdog,如果最后再調(diào)用一次appendTail(sb),那么 sb 最終的內(nèi)容將是 fatdogfatdogfat。還是有點(diǎn)模糊?那么我們來看個(gè)簡單的程序:/該例將把句子里的Kelvin改為Kevinimp

16、ortjava.util.regex.*;publicclassMatcherTestpublicstaticvoidmain(Stringargs)throwsException生成 Pattern 對象并且編譯一個(gè)簡單的正則表達(dá)式KelvinPatternp=Ppile(Kevin);用 Pattern 類的 matcher()方法生成一個(gè) Matcher 對象Matcherm=p.matcher(KelvinLiandKelvinChanarebothworkinginKelvinChensKelvinSoftShopcompany);StringBuffersb=newStringBu

17、ffer();inti=0;使用 find()方法查找第一個(gè)匹配的對象booleanresult=m.find();/使用循環(huán)將句子里所力的 kelvin 找出并替換再將內(nèi)容加到 sb 里while(result)i+;m.appendReplacement(sb,Kevin);System.out.println(第+i+”次匹配后 sb 的內(nèi)容是:+sb);/繼續(xù)查找下一個(gè)匹配對象result=m.find();)/最后調(diào)用 appendTail(方法將最后一次匹配后的剩余字符串加到 sb 里;m.appendTail(sb);System.out.println(調(diào)用 m.appendT

18、ail(sb 后 sb 的最終內(nèi)容是:+sb.toString();)最終輸出結(jié)果為:第 1 次匹配后 sb 的內(nèi)容是:Kevin第 2 次匹配后 sb 的內(nèi)容是:KevinLiandKevin第 3 次匹配后 sb 的內(nèi)容是:KevinLiandKevinChanarebothworkinginKevin第 4 次匹配后 sb 的內(nèi)容是:KevinLiandKevinChanarebothworkinginKevinChensKevin調(diào)用 m.appendTail(sb 后 sb 的最終內(nèi)容是:KevinLiandKevinChanarebothworkinginKevinChensKev

19、inSoftShopcompany.看了上面這個(gè)例程是否對 appendReplacement(),appendTail(M 個(gè)方法的使用更清楚呢,如果還是不太肯定最好自己動(dòng)手寫幾行代碼測試一下。group()/group(intgroup)/groupCount():該系列方法與我們在上篇介紹的 Jakarta-ORO的 MatchResult.group()方法類似(有關(guān) Jakarta-ORO 請參考上篇的內(nèi)容),都是要返回與組匹配的子用內(nèi)容,下面代碼將很好解釋其用法:importjava.util.regex.*;publicclassGroupTestpublicstaticvoid

20、main(Stringargs)throwsExceptionPatternp=Ppile(ca)(t);Matcherm=p.matcher(onecat,twocatsintheyard);StringBuffersb=newStringBuffer();booleanresult=m.find();System.out.println(該次查找獲得匹配組的數(shù)量為:+m.groupCount();for(inti=1;i=m)輸出為:該次查找獲得匹配組的數(shù)量為:2第 1 組的子用內(nèi)容為:ca第 2 組的子用內(nèi)容為:tMatcher 對象的其他方法因比較好理解且由于篇幅有限,請讀者自己編程驗(yàn)

21、證。4 .一個(gè)檢驗(yàn) Email 地址的小程序:最后我們來看一個(gè)檢驗(yàn) Email 地址的例程,該程序是用來檢驗(yàn)一個(gè)輸入的 EMAIL 地址里所包含的字符是否合法,雖然這不是一個(gè)完整的 EMAIL 地址檢驗(yàn)程序,它不能檢驗(yàn)所有可能出現(xiàn)的情況,但在必要時(shí)您可以在其基礎(chǔ)上增加所需功能。importjava.util.regex.*;publicclassEmailpublicstaticvoidmain(Stringargs)throwsExceptionStringinput=args0;檢測輸入的 EMAIL 地址是否以非法符號.或作為起始字符Patternp=Ppile(A.1A);Matcherm=p.matcher(input);if(m檢測是否以www.為起始p=Ppile(Awww.);m=p.matcher(input);if(m/檢測是否包含非法字符p=Ppile(AA-Za-z0-9._-#+);m=p.matcher(input);StringBuffersb=newString

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論