久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

java Pattern和Matcher詳解

 小胡子的是也 2016-03-06

結(jié)論:Pattern與Matcher一起合作.Matcher類提供了對正則表達(dá)式的分組支持,以及對正則表達(dá)式的多次匹配支持. 單獨(dú)用Pattern只能使用Pattern.matcher(String regex,CharSequence input)一種最基礎(chǔ)最簡單的匹配,。

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代碼示例: 
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代碼示例: 
Pattern p=Pattern.compile("\\d+"); 
String[] str=p.split("我的QQ是:456456我的電話是:0532214我的郵箱是:[email protected]"); 

結(jié)果:str[0]="我的QQ是:" str[1]="我的電話是:" str[2]="我的郵箱是:[email protected]

2.Pattern.matcher(String regex,CharSequence input)是一個(gè)靜態(tài)方法,用于快速匹配字符串,該方法適合用于只匹配一次,且匹配全部字符串. 
Java代碼示例: 
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代碼示例: 
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代碼示例: 
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代碼示例: 
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代碼示例: 
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代碼示例: 
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=p.matcher("2223bb"); 
m2.lookingAt();   //匹配2223 
m2.start();   //返回0,由于lookingAt()只能匹配前面的字符串,所以當(dāng)使用lookingAt()匹配時(shí),start()方法總是返回0 
m2.end();   //返回4 
m2.group();   //返回2223 

Matcher m3=p.matcher("2223"); //如果Matcher m3=p.matcher("2223bb"); 那么下面的方法出錯,因?yàn)椴黄ヅ浞祷豧alse
m3.matches();   //匹配整個(gè)字符串 
m3.start();   //返回0
m3.end();   //返回3,原因相信大家也清楚了,因?yàn)閙atches()需要匹配所有字符串 
m3.group();   //返回2223

說了這么多,相信大家都明白了以上幾個(gè)方法的使用,該說說正則表達(dá)式的分組在java中是怎么使用的. 
start(),end(),group()均有一個(gè)重載方法它們是start(int i),end(int i),group(int i)專用于分組操作,Mathcer類還有一個(gè)groupCount()用于返回有多少組. 
Java代碼示例: 
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代碼示例: 
Pattern p=Pattern.compile("\\d+"); 
Matcher m=p.matcher("我的QQ是:456456 我的電話是:0532214 我的郵箱是:[email protected]"); 
while(m.find()) { 
     System.out.println(m.group()); 


輸出: 
456456 
0532214 
123 

如將以上while()循環(huán)替換成 
while(m.find()) { 
     System.out.println(m.group()); 
     System.out.print("start:"+m.start()); 
     System.out.println(" end:"+m.end()); 

則輸出: 
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í),才可以使用.

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多