大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 Java正則表達式匹配:Pattern類與Matcher類詳解

Java正則表達式匹配:Pattern類與Matcher類詳解

更新時間:2021-05-14 16:23:59 來源:動力節點 瀏覽1167次

Java.util.regex是一個用正則表達式所訂制的模式來對字符串進行匹配工作的類庫包。它包括兩個類:Pattern和Matcher Pattern一個Pattern是一個正則表達式經編譯后的表現模式。Matcher一個Matcher對象是一個狀態機器,它依據Pattern對象做為匹配模式對字符串展開匹配檢查。首先一個Pattern實例訂制了一個所用語法與PERL的類似的正則表達式經編譯后的模式,然后一個Matcher實例在這個給定的Pattern實例的模式控制下進行字符串的匹配工作。

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

一. 捕獲組的概念

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

1        ((A)(B(C)))
2        (A)
3        (B(C))
4        (C)

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

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

二. 詳解Pattern類和Matcher類

java正則表達式通過java.util.regex包下的Pattern類與Matcher類實現(建議在閱讀本文時,打開java API文檔,當介紹到哪個方法時,查看java API中的方法說明,效果會更佳).

Pattern類用于創建一個正則表達式,也可以說創建一個匹配模式,它的構造方法是私有的,不可以直接創建,但可以通過Pattern.complie(String regex)簡單工廠方法創建一個正則表達式,

Java代碼示例:

Pattern p=Pattern.compile("\\w+"); 
p.pattern();//返回 \w+ 

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

1.Pattern.split(CharSequence input)

Pattern有一個split(CharSequence input)方法,用于分隔字符串,并返回一個String[],我猜String.split(String regex)就是通過Pattern.split(CharSequence input)來實現的.

Java代碼示例:

Pattern p=Pattern.compile("\\d+"); 
String[] str=p.split("我的QQ是:456456我的電話是:0532214我的郵箱是:[email protected]"); 

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

2.Pattern.matcher(String regex,CharSequence input)是一個靜態方法,用于快速匹配字符串,該方法適合用于只匹配一次,且匹配全部字符串.

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類的構造方法也是私有的,不能隨意創建,只能通過Pattern.matcher(CharSequence input)方法得到該類的實例.

Pattern類只能做一些簡單的匹配操作,要想得到更強更便捷的正則匹配操作,那就需要將Pattern與Matcher一起合作.Matcher類提供了對正則表達式的分組支持,以及對正則表達式的多次匹配支持.

Java代碼示例:

Pattern p=Pattern.compile("\\d+"); 
Matcher m=p.matcher("22bb23"); 
m.pattern();//返回p 也就是返回該Matcher對象是由哪個Pattern對象的創建的 

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+匹配到了整個字符串

我們現在回頭看一下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()執行匹配操作后,就可以利用以上三個方法得到更詳細的信息.

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,返回第二組匹配到的子字符串

現在我們使用一下稍微高級點的正則匹配操作,例如有一段文本,里面有很多數字,而且這些數字是分開的,我們現在要將文本中所有數字都取出來,利用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()循環替換成

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 

現在大家應該知道,每次執行匹配操作后start(),end(),group()三個方法的值都會改變,改變成匹配到的子字符串的信息,以及它們的重載方法,也會改變成相應的信息.

注意:只有當匹配操作成功,才可以使用start(),end(),group()三個方法,否則會拋出java.lang.IllegalStateException,也就是當matches(),lookingAt(),find()其中任意一個方法返回true時,才可以使用.

以上就是動力節點小編介紹的"Java正則表達式匹配:Pattern類與Matcher類詳解",希望對大家有幫助,如有疑問,請在線咨詢,有專業老師隨時為您服務。

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 国产精品免费视频一区一 | 国产精品青草久久久久婷婷 | 中文字幕日本不卡一二三区 | 一级片免费网址 | 国产亚洲女在线精品 | 美女被爆羞羞视频网站视频 | 草草福利影院 | 精品日韩一区二区三区视频 | 国产精品九九视频 | 欧美日韩在线成人免费 | 日韩伦理亚洲欧美在线一区 | 国产精品第九页 | 久久永久免费视频 | 欧美一级成人毛片影院 | 黑人欧美一级毛片 | 久久国产免费一区二区三区 | 九九99热 | 精品成人免费播放国产片 | 日韩在线免费视频观看 | 日韩在线播放中文字幕 | 国产激情一区二区三区 | 亚洲日本久久久午夜精品 | 精品亚洲无人区一区二区 | 亚洲精品综合网 | 五月天婷婷在线免费观看 | 欧美日韩一区二区不卡三区 | 亚洲精品国产综合99久久一区 | 四虎永久成人免费 | 四虎影院在线免费播放 | 久久国产精品ww | 亚洲综合精品成人 | 久久一区二区免费播放 | 手机看片欧美日韩 | 橘子视频在线观看 | 国产在线视频精品视频免费看 | 在线观看视频色 | 99久久亚洲| 免费a级毛片大学生免费观看 | 国内精品手机在线观看视频 | 久久www香蕉免费人成 | 99久久国产亚洲综合精品 |