日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JAVA正则表达式:Pattern类与Matcher类详解

發(fā)布時間:2025/3/21 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAVA正则表达式:Pattern类与Matcher类详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
java.util.regex是一個用正則表達式所訂制的模式來對字符串進行匹配工作的類庫包。它包括兩個類:Pattern和Matcher Pattern 一個Pattern是一個正則表達式經(jīng)編譯后的表現(xiàn)模式。 Matcher 一個Matcher對象是一個狀態(tài)機器,它依據(jù)Pattern對象做為匹配模式對字符串展開匹配檢查。 首先一個Pattern實例訂制了一個所用語法與PERL的類似的正則表達式經(jīng)編譯后的模式,然后一個Matcher實例在這個給定的Pattern實例的模式控制下進行字符串的匹配工作。

以下我們就分別來看看這兩個類:

一、捕獲組的概念

捕獲組可以通過從左到右計算其開括號來編號,編號是從1 開始的。例如,在表達式 ((A)(B(C)))中,存在四個這樣的組:

1??? ??? ((A)(B(C)))
2??? ??? (A)
3??? ??? (B(C))
4??? ??? (C)
組零始終代表整個表達式。 以 (?) 開頭的組是純的非捕獲 組,它不捕獲文本,也不針對組合計進行計數(shù)。

與組關聯(lián)的捕獲輸入始終是與組最近匹配的子序列。如果由于量化的緣故再次計算了組,則在第二次計算失敗時將保留其以前捕獲的值(如果有的話)例如,將字符串"aba" 與表達式(a(b)?)+ 相匹配,會將第二組設置為 "b"。在每個匹配的開頭,所有捕獲的輸入都會被丟棄。

二、詳解Pattern類和Matcher類

java正則表達式通過java.util.regex包下的Pattern類與Matcher類實現(xiàn)(建議在閱讀本文時,打開java API文檔,當介紹到哪個方法時,查看java API中的方法說明,效果會更佳).?
Pattern類用于創(chuàng)建一個正則表達式,也可以說創(chuàng)建一個匹配模式,它的構造方法是私有的,不可以直接創(chuàng)建,但可以通過Pattern.complie(String regex)簡單工廠方法創(chuàng)建一個正則表達式,?
Java代碼示例:?
Pattern p=Pattern.compile("\\w+");?
p.pattern();//返回 \w+?

pattern() 返回正則表達式的字符串形式,其實就是返回Pattern.complile(String regex)的regex參數(shù)?

1.Pattern.split(CharSequence input)

Pattern有一個split(CharSequence input)方法,用于分隔字符串,并返回一個String[],我猜String.split(String regex)就是通過Pattern.split(CharSequence input)來實現(xiàn)的.?
Java代碼示例:?
Pattern p=Pattern.compile("\\d+");?
String[] str=p.split("我的QQ是:456456我的電話是:0532214我的郵箱是:aaa@aaa.com");?

結果:str[0]="我的QQ是:" str[1]="我的電話是:" str[2]="我的郵箱是:aaa@aaa.com"?

2.Pattern.matcher(String regex,CharSequence input)是一個靜態(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)返回一個Matcher對象.?
Matcher類的構造方法也是私有的,不能隨意創(chuàng)建,只能通過Pattern.matcher(CharSequence input)方法得到該類的實例.?
Pattern類只能做一些簡單的匹配操作,要想得到更強更便捷的正則匹配操作,那就需要將Pattern與Matcher一起合作.Matcher類提供了對正則表達式的分組支持,以及對正則表達式的多次匹配支持.?
Java代碼示例:?
Pattern p=Pattern.compile("\\d+");?
Matcher m=p.matcher("22bb23");?
m.pattern();//返回p 也就是返回該Matcher對象是由哪個Pattern對象的創(chuàng)建的?

4.Matcher.matches()/ Matcher.lookingAt()/ Matcher.find()

Matcher類提供三個匹配操作方法,三個方法均返回boolean類型,當匹配到時返回true,沒匹配到則返回false?
matches()對整個字符串進行匹配,只有整個字符串都匹配了才返回true?
Java代碼示例:?
Pattern p=Pattern.compile("\\d+");?
Matcher m=p.matcher("22bb23");?
m.matches();//返回false,因為bb不能被\d+匹配,導致整個字符串匹配未成功.?
Matcher m2=p.matcher("2223");?
m2.matches();//返回true,因為\d+匹配到了整個字符串?

我們現(xiàn)在回頭看一下Pattern.matcher(String regex,CharSequence input),它與下面這段代碼等價?
Pattern.compile(regex).matcher(input).matches()?

lookingAt()對前面的字符串進行匹配,只有匹配到的字符串在最前面才返回true?
Java代碼示例:?
Pattern p=Pattern.compile("\\d+");?
Matcher m=p.matcher("22bb23");?
m.lookingAt();//返回true,因為\d+匹配到了前面的22?
Matcher m2=p.matcher("aa2223");?
m2.lookingAt();//返回false,因為\d+不能匹配前面的aa?

find()對字符串進行匹配,匹配到的字符串可以在任何位置.?
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()

當使用matches(),lookingAt(),find()執(zhí)行匹配操作后,就可以利用以上三個方法得到更詳細的信息.?
start()返回匹配到的子字符串在字符串中的索引位置.?
end()返回匹配到的子字符串的最后一個字符在字符串中的索引位置.?
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=m.matcher("2223bb");?
m.lookingAt();?? //匹配2223?
m.start();?? //返回0,由于lookingAt()只能匹配前面的字符串,所以當使用lookingAt()匹配時,start()方法總是返回0?
m.end();?? //返回4?
m.group();?? //返回2223?

Matcher m3=m.matcher("2223bb");?
m.matches();?? //匹配整個字符串?
m.start();?? //返回0,原因相信大家也清楚了?
m.end();?? //返回6,原因相信大家也清楚了,因為matches()需要匹配所有字符串?
m.group();?? //返回2223bb?

說了這么多,相信大家都明白了以上幾個方法的使用,該說說正則表達式的分組在java中是怎么使用的.?
start(),end(),group()均有一個重載方法它們是start(int i),end(int i),group(int i)專用于分組操作,Mathcer類還有一個groupCount()用于返回有多少組.?
Java代碼示例:?
Pattern p=Pattern.compile("([a-z]+)(\\d+)");?
Matcher m=p.matcher("aaa2223bb");?
m.find();?? //匹配aaa2223?
m.groupCount();?? //返回2,因為有2組?
m.start(1);?? //返回0 返回第一組匹配到的子字符串在字符串中的索引號?
m.start(2);?? //返回3?
m.end(1);?? //返回3 返回第一組匹配到的子字符串的最后一個字符在字符串中的索引位置.?
m.end(2);?? //返回7?
m.group(1);?? //返回aaa,返回第一組匹配到的子字符串?
m.group(2);?? //返回2223,返回第二組匹配到的子字符串?

現(xiàn)在我們使用一下稍微高級點的正則匹配操作,例如有一段文本,里面有很多數(shù)字,而且這些數(shù)字是分開的,我們現(xiàn)在要將文本中所有數(shù)字都取出來,利用java的正則操作是那么的簡單.?
Java代碼示例:?
Pattern p=Pattern.compile("\\d+");?
Matcher m=p.matcher("我的QQ是:456456 我的電話是:0532214 我的郵箱是:aaa123@aaa.com");?
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)在大家應該知道,每次執(zhí)行匹配操作后start(),end(),group()三個方法的值都會改變,改變成匹配到的子字符串的信息,以及它們的重載方法,也會改變成相應的信息.?
注意:只有當匹配操作成功,才可以使用start(),end(),group()三個方法,否則會拋出java.lang.IllegalStateException,也就是當matches(),lookingAt(),find()其中任意一個方法返回true時,才可以使用.


from:?http://www.kaiyuanba.cn/html/1/131/138/7609.htm

總結

以上是生活随笔為你收集整理的JAVA正则表达式:Pattern类与Matcher类详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 奇米一区 | 国产最新地址 | 日本黄图| 理论片在线观看理伦片 | 日韩高清三区 | 人妻少妇精品一区二区三区 | 日韩欧美综合视频 | 亚洲国产精品成人综合在线 | 丁香婷婷色 | 偷拍自拍一区 | 日韩一区二区三区免费在线观看 | 欧美精品久久久 | 国产精品99久久久久 | 奇米777第四色 | 成人交性视频免费看 | 欧美一级免费大片 | 天堂色区 | 亚洲欧美中文日韩在线v日本 | 亚洲日本欧美 | 亚洲av无一区二区三区久久 | 8x8x国产精品一区二区 | 18做爰免费视频网站 | 91美女片黄在线观看游戏 | 久久国产精品免费视频 | 免费日韩视频 | 亚洲国产aⅴ精品一区二区的游戏 | 欧美综合亚洲图片综合区 | 青青草激情| 欧美亚洲精品在线 | 日本免费久久 | 国产一区二区三区在线 | 日日干日日射 | 成人欧美精品一区二区 | 男女午夜影院 | 亚洲人成电影在线播放 | 一区二区三区精 | 国产欧美一区二区三区精华液好吗 | 熟妇高潮一区二区三区 | 亚洲乱码国产乱码精品精 | 91精品国产91久久久久久吃药 | 国产精品美女久久久久 | 久久久99精品免费观看 | 初高中福利视频网站 | www.黄色av| 亚洲 欧美 日韩 综合 | 日韩av资源站 | 欧美性猛交xxxx乱大交退制版 | 成人午夜看片 | 波多野结衣中文字幕一区二区 | 奇米在线观看 | www.国产区 | 日韩精品在线看 | brazzers欧美极品少妇 | 3d动漫啪啪精品一区二区中文字幕 | 日本一本在线观看 | jizzjizz美国| 中国亚洲老头同性gay男男… | 向日葵视频在线 | 久久久久久无码精品人妻一区二区 | 久久入口 | 免费黄色美女网站 | 青青草原成人 | 91嫩草网 | 在线播放日韩av | 中文在线字幕观看 | 一区二区在线国产 | 大白屁股一区二区视频 | av成人在线免费观看 | 在线国产三级 | 一级久久久久久 | 韩国性猛交╳xxx乱大交 | 亚洲综合中文字幕在线 | 国产欧美一区二区三区免费看 | www.男女| 亚洲av无码国产精品久久不卡 | 成人国产一区二区三区精品麻豆 | 久久精品国产熟女亚洲AV麻豆 | 名校风暴在线观看免费高清完整 | 欧美一区二区在线观看 | av在线男人天堂 | 成人写真福利网 | 欧美 日韩 国产在线 | 久久久精品99 | 日韩黄色一级视频 | 亚洲一区二区三区在线观看视频 | 波多野结衣电影在线播放 | 欧美一级黄色片在线观看 | 污片免费看 | 欧美视频在线观看一区二区 | 国产又黄又猛视频 | 欧美午夜精品久久久久久蜜 | 99成人国产精品视频 | www.日本免费| 淫辱的世界(调教sm)by | 大奶子在线观看 | 国模视频一区二区 | 性——交——性——乱免费的 | 日韩激情中文字幕 | 中国 免费 av |