前言
本文將介紹Java正則表達(dá)式中的Pattern類與Matcher類。首先我們要清楚指定為字符串的正則表達(dá)式必須首先被編譯為pattern類的實(shí)例。因此如何更好的了解這兩個(gè)類,是編程人員必須知道的。
以下我們就分別來看看這兩個(gè)類:
一、捕獲組的概念
捕獲組可以通過從左到右計(jì)算其開括號來編號,編號是從1 開始的。例如,在表達(dá)式 ((A)(B(C)))中,存在四個(gè)這樣的組:
1
2
3
4
|
1 ((A)(B(C))) 2 (A) 3 (B(C)) 4 (C) |
組零始終代表整個(gè)表達(dá)式。 以 (?) 開頭的組是純的非捕獲 組,它不捕獲文本,也不針對組合計(jì)進(jìn)行計(jì)數(shù)。
與組關(guān)聯(lián)的捕獲輸入始終是與組最近匹配的子序列。如果由于量化的緣故再次計(jì)算了組,則在第二次計(jì)算失敗時(shí)將保留其以前捕獲的值(如果有的話)例如,將字符串"aba" 與表達(dá)式(a(b)?)+ 相匹配,會將第二組設(shè)置為 "b"。在每個(gè)匹配的開頭,所有捕獲的輸入都會被丟棄。
二、詳解Pattern類和Matcher類
java正則表達(dá)式通過java.util.regex包下的Pattern類與Matcher類實(shí)現(xiàn)(建議在閱讀本文時(shí),打開java API文檔,當(dāng)介紹到哪個(gè)方法時(shí),查看java API中的方法說明,效果會更佳).
Pattern類用于創(chuàng)建一個(gè)正則表達(dá)式,也可以說創(chuàng)建一個(gè)匹配模式,它的構(gòu)造方法是私有的,不可以直接創(chuàng)建,但可以通過Pattern.complie(String regex)
簡單工廠方法創(chuàng)建一個(gè)正則表達(dá)式,
Java代碼示例:
1
2
|
Pattern p=Pattern.compile( "\\w+" ); p.pattern(); //返回 \w+ |
pattern()
返回正則表達(dá)式的字符串形式,其實(shí)就是返回Pattern.complile(String regex)
的regex參數(shù)
1.Pattern.split(CharSequence input)
Pattern有一個(gè)split(CharSequence input)
方法,用于分隔字符串,并返回一個(gè)String[],我猜String.split(String regex)
就是通過Pattern.split(CharSequence input)
來實(shí)現(xiàn)的.
Java代碼示例:
1
2
|
Pattern p=Pattern.compile( "\\d+" ); |
結(jié)果:str[0]="我的QQ是:" str[1]="我的電話是:" str[2]="我的郵箱是:[email protected]"
2.Pattern.matcher(String regex,CharSequence input)是一個(gè)靜態(tài)方法,用于快速匹配字符串,該方法適合用于只匹配一次,且匹配全部字符串.
Java代碼示例:
1
2
3
|
Pattern.matches( "\\d+" , "2223" ); //返回true Pattern.matches( "\\d+" , "2223aa" ); //返回false,需要匹配到所有字符串才能返回true,這里aa不能匹配到 Pattern.matches( "\\d+" , "22bb23" ); //返回false,需要匹配到所有字符串才能返回true,這里bb不能匹配到 |
3.Pattern.matcher(CharSequence input)
說了這么多,終于輪到Matcher類登場了,Pattern.matcher(CharSequence input)
返回一個(gè)Matcher對象.
Matcher類的構(gòu)造方法也是私有的,不能隨意創(chuàng)建,只能通過Pattern.matcher(CharSequence input)
方法得到該類的實(shí)例.
Pattern類只能做一些簡單的匹配操作,要想得到更強(qiáng)更便捷的正則匹配操作,那就需要將Pattern與Matcher一起合作.Matcher類提供了對正則表達(dá)式的分組支持,以及對正則表達(dá)式的多次匹配支持.
Java代碼示例:
1
2
3
|
Pattern p=Pattern.compile( "\\d+" ); Matcher m=p.matcher( "22bb23" ); m.pattern(); //返回p 也就是返回該Matcher對象是由哪個(gè)Pattern對象的創(chuàng)建的 |
4.Matcher.matches()/ Matcher.lookingAt()/ Matcher.find()
Matcher類提供三個(gè)匹配操作方法,三個(gè)方法均返回boolean類型,當(dāng)匹配到時(shí)返回true,沒匹配到則返回false
matches()
對整個(gè)字符串進(jìn)行匹配,只有整個(gè)字符串都匹配了才返回true
Java代碼示例:
1
2
3
4
5
|
Pattern p=Pattern.compile( "\\d+" ); Matcher m=p.matcher( "22bb23" ); m.matches(); //返回false,因?yàn)閎b不能被\d+匹配,導(dǎo)致整個(gè)字符串匹配未成功. Matcher m2=p.matcher( "2223" ); m2.matches(); //返回true,因?yàn)閈d+匹配到了整個(gè)字符串 |
我們現(xiàn)在回頭看一下Pattern.matcher(String regex,CharSequence input)
,它與下面這段代碼等價(jià)
Pattern.compile(regex).matcher(input).matches()
lookingAt()
對前面的字符串進(jìn)行匹配,只有匹配到的字符串在最前面才返回true
Java代碼示例:
1
2
3
4
5
|
Pattern p=Pattern.compile( "\\d+" ); Matcher m=p.matcher( "22bb23" ); m.lookingAt(); //返回true,因?yàn)閈d+匹配到了前面的22 Matcher m2=p.matcher( "aa2223" ); m2.lookingAt(); //返回false,因?yàn)閈d+不能匹配前面的aa |
find()
對字符串進(jìn)行匹配,匹配到的字符串可以在任何位置.
Java代碼示例:
1
2
3
4
5
6
7
8
9
|
Pattern p=Pattern.compile( "\\d+" ); Matcher m=p.matcher( "22bb23" ); m.find(); //返回true Matcher m2=p.matcher( "aa2223" ); m2.find(); //返回true Matcher m3=p.matcher( "aa2223bb" ); m3.find(); //返回true Matcher m4=p.matcher( "aabb" ); m4.find(); //返回false |
5.Mathcer.start()/ Matcher.end()/ Matcher.group()
當(dāng)使用matches()
, lookingAt()
, find()
執(zhí)行匹配操作后,就可以利用以上三個(gè)方法得到更詳細(xì)的信息.
start()
返回匹配到的子字符串在字符串中的索引位置.
end()
返回匹配到的子字符串的最后一個(gè)字符在字符串中的索引位置.
group()
返回匹配到的子字符串
Java代碼示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
Pattern p=Pattern.compile( "\\d+" ); Matcher m=p.matcher( "aaa2223bb" ); m.find(); //匹配2223 m.start(); //返回3 m.end(); //返回7,返回的是2223后的索引號 m.group(); //返回2223 Mathcer m2=m.matcher( "2223bb" ); m.lookingAt(); //匹配2223 m.start(); //返回0,由于lookingAt()只能匹配前面的字符串,所以當(dāng)使用lookingAt()匹配時(shí),start()方法總是返回0 m.end(); //返回4 m.group(); //返回2223 Matcher m3=m.matcher( "2223bb" ); m.matches(); //匹配整個(gè)字符串 m.start(); //返回0,原因相信大家也清楚了 m.end(); //返回6,原因相信大家也清楚了,因?yàn)閙atches()需要匹配所有字符串 m.group(); //返回2223bb |
說了這么多,相信大家都明白了以上幾個(gè)方法的使用,該說說正則表達(dá)式的分組在java中是怎么使用的.
start()
, end()
, group()
均有一個(gè)重載方法它們是start(int i)
, end(int i)
, group(int i)
專用于分組操作,Mathcer類還有一個(gè)groupCount()
用于返回有多少組.
Java代碼示例:
1
2
3
4
5
6
7
8
9
10
|
Pattern p=Pattern.compile( "([a-z]+)(\\d+)" ); Matcher m=p.matcher( "aaa2223bb" ); m.find(); //匹配aaa2223 m.groupCount(); //返回2,因?yàn)橛?組 m.start( 1 ); //返回0 返回第一組匹配到的子字符串在字符串中的索引號 m.start( 2 ); //返回3 m.end( 1 ); //返回3 返回第一組匹配到的子字符串的最后一個(gè)字符在字符串中的索引位置. m.end( 2 ); //返回7 m.group( 1 ); //返回aaa,返回第一組匹配到的子字符串 m.group( 2 ); //返回2223,返回第二組匹配到的子字符串 |
現(xiàn)在我們使用一下稍微高級點(diǎn)的正則匹配操作,例如有一段文本,里面有很多數(shù)字,而且這些數(shù)字是分開的,我們現(xiàn)在要將文本中所有數(shù)字都取出來,利用java的正則操作是那么的簡單.
Java代碼示例:
1
2
3
4
5
|
Pattern p=Pattern.compile( "\\d+" ); while (m.find()) { System.out.println(m.group()); } |
輸出:
1
2
3
|
456456 0532214 123 |
如將以上while()
循環(huán)替換成
1
2
3
4
5
|
while (m.find()) { System.out.println(m.group()); System.out.print( "start:" +m.start()); System.out.println( " end:" +m.end()); } |
則輸出:
1
2
3
4
5
6
|
456456 start: 6 end: 12 0532214 start: 19 end: 26 123 start: 36 end: 39 |
現(xiàn)在大家應(yīng)該知道,每次執(zhí)行匹配操作后start()
, end()
, group()
三個(gè)方法的值都會改變,改變成匹配到的子字符串的信息,以及它們的重載方法,也會改變成相應(yīng)的信息.
注意:只有當(dāng)匹配操作成功,才可以使用start()
, end()
, group()
三個(gè)方法,否則會拋出java.lang.IllegalStateException
,也就是當(dāng)matches()
, lookingAt()
, find()
其中任意一個(gè)方法返回true時(shí),才可以使用.
總結(jié)
以上就這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對服務(wù)器之家的支持。