欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Java正則表達(dá)式中Pattern類和Matcher類

 更新時(shí)間:2016年12月21日 09:13:25   投稿:daisy  
java.util.regex是一個(gè)用正則表達(dá)式所訂制的模式來(lái)對(duì)字符串進(jìn)行匹配工作的類庫(kù)包。包括兩個(gè)類Pattern和Matcher Pattern,Pattern是一個(gè)正則表達(dá)式經(jīng)編譯后的表現(xiàn)模式。Matcher對(duì)象是一個(gè)狀態(tài)機(jī)器,它依據(jù)Pattern對(duì)象做為匹配模式對(duì)字符串展開(kāi)匹配檢查。

前言

本文將介紹Java正則表達(dá)式中的Pattern類與Matcher類。首先我們要清楚指定為字符串的正則表達(dá)式必須首先被編譯為pattern類的實(shí)例。因此如何更好的了解這兩個(gè)類,是編程人員必須知道的。

以下我們就分別來(lái)看看這兩個(gè)類:

一、捕獲組的概念

捕獲組可以通過(guò)從左到右計(jì)算其開(kāi)括號(hào)來(lái)編號(hào),編號(hào)是從1 開(kāi)始的。例如,在表達(dá)式 ((A)(B(C)))中,存在四個(gè)這樣的組:

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

組零始終代表整個(gè)表達(dá)式。 以 (?) 開(kāi)頭的組是純的非捕獲 組,它不捕獲文本,也不針對(duì)組合計(jì)進(jìn)行計(jì)數(shù)。

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

二、詳解Pattern類和Matcher類

java正則表達(dá)式通過(guò)java.util.regex包下的Pattern類與Matcher類實(shí)現(xiàn)(建議在閱讀本文時(shí),打開(kāi)java API文檔,當(dāng)介紹到哪個(gè)方法時(shí),查看java API中的方法說(shuō)明,效果會(huì)更佳).

Pattern類用于創(chuàng)建一個(gè)正則表達(dá)式,也可以說(shuō)創(chuàng)建一個(gè)匹配模式,它的構(gòu)造方法是私有的,不可以直接創(chuàng)建,但可以通過(guò)Pattern.complie(String regex)簡(jiǎn)單工廠方法創(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)就是通過(guò)Pattern.split(CharSequence input)來(lái)實(shí)現(xiàn)的.

Java代碼示例:

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

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

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)

說(shuō)了這么多,終于輪到Matcher類登場(chǎng)了,Pattern.matcher(CharSequence input)返回一個(gè)Matcher對(duì)象.
Matcher類的構(gòu)造方法也是私有的,不能隨意創(chuàng)建,只能通過(guò)Pattern.matcher(CharSequence input)方法得到該類的實(shí)例.
Pattern類只能做一些簡(jiǎn)單的匹配操作,要想得到更強(qiáng)更便捷的正則匹配操作,那就需要將Pattern與Matcher一起合作.Matcher類提供了對(duì)正則表達(dá)式的分組支持,以及對(duì)正則表達(dá)式的多次匹配支持.

Java代碼示例:

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

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

Matcher類提供三個(gè)匹配操作方法,三個(gè)方法均返回boolean類型,當(dāng)匹配到時(shí)返回true,沒(méi)匹配到則返回false

matches()對(duì)整個(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()對(duì)前面的字符串進(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()對(duì)字符串進(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后的索引號(hào) 
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 

說(shuō)了這么多,相信大家都明白了以上幾個(gè)方法的使用,該說(shuō)說(shuō)正則表達(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 返回第一組匹配到的子字符串在字符串中的索引號(hào) 
m.start(2); //返回3 
m.end(1); //返回3 返回第一組匹配到的子字符串的最后一個(gè)字符在字符串中的索引位置. 
m.end(2); //返回7 
m.group(1); //返回aaa,返回第一組匹配到的子字符串 
m.group(2); //返回2223,返回第二組匹配到的子字符串 

現(xiàn)在我們使用一下稍微高級(jí)點(diǎn)的正則匹配操作,例如有一段文本,里面有很多數(shù)字,而且這些數(shù)字是分開(kāi)的,我們現(xiàn)在要將文本中所有數(shù)字都取出來(lái),利用java的正則操作是那么的簡(jiǎn)單.

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)在大家應(yīng)該知道,每次執(zhí)行匹配操作后start() , end() , group()三個(gè)方法的值都會(huì)改變,改變成匹配到的子字符串的信息,以及它們的重載方法,也會(huì)改變成相應(yīng)的信息.

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

總結(jié)

以上就這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • ThreadPoolExecutor中的submit()方法詳細(xì)講解

    ThreadPoolExecutor中的submit()方法詳細(xì)講解

    在使用線程池的時(shí)候,發(fā)現(xiàn)除了execute()方法可以執(zhí)行任務(wù)外,還發(fā)現(xiàn)有一個(gè)方法submit()可以執(zhí)行任務(wù),本文就詳細(xì)的介紹一下ThreadPoolExecutor中的submit()方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2022-04-04
  • 在windows環(huán)境下安裝jdk8、jdk9、jdk11、jdk12并自由切換

    在windows環(huán)境下安裝jdk8、jdk9、jdk11、jdk12并自由切換

    這篇文章主要介紹了在windows環(huán)境下安裝jdk8、jdk9、jdk11、jdk12并自由切換,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • ClassLoader雙親委派模式作用詳解

    ClassLoader雙親委派模式作用詳解

    這篇文章主要為大家介紹了ClassLoader雙親委派模式作用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • springboot接收別人上傳的本地視頻實(shí)例代碼

    springboot接收別人上傳的本地視頻實(shí)例代碼

    本文通過(guò)實(shí)例代碼給大家介紹了springboot接收別人上傳的本地視頻,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2018-07-07
  • Java基礎(chǔ)之List內(nèi)元素的排序性能對(duì)比

    Java基礎(chǔ)之List內(nèi)元素的排序性能對(duì)比

    這篇文章主要介紹了Java基礎(chǔ)之List內(nèi)元素的排序性能對(duì)比,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • Java實(shí)現(xiàn)多線程大批量同步數(shù)據(jù)(分頁(yè))

    Java實(shí)現(xiàn)多線程大批量同步數(shù)據(jù)(分頁(yè))

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)多線程大批量同步數(shù)據(jù)(分頁(yè)),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • Java中的ThreadLocal線程池原理

    Java中的ThreadLocal線程池原理

    這篇文章主要介紹了Java中的ThreadLocal線程池原理,ThreadLocal提供了線程的局部變量(或本地變量),它可以保證訪問(wèn)到的變量屬于當(dāng)前線程,每個(gè)訪問(wèn)這種變量的線程(通過(guò)它的get或set方法)都有自己的、獨(dú)立初始化的變量副本,需要的朋友可以參考下
    2023-11-11
  • String實(shí)例化及static final修飾符實(shí)現(xiàn)方法解析

    String實(shí)例化及static final修飾符實(shí)現(xiàn)方法解析

    這篇文章主要介紹了String實(shí)例化及static final修飾符實(shí)現(xiàn)方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Java中List轉(zhuǎn)字符串的5種方法解析

    Java中List轉(zhuǎn)字符串的5種方法解析

    在Java中將一個(gè)List轉(zhuǎn)換為字符串有多種方法,下面這篇文章主要給大家介紹了關(guān)于Java中List轉(zhuǎn)字符串的5種方法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • 完整B樹(shù)算法Java實(shí)現(xiàn)代碼

    完整B樹(shù)算法Java實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了完整的B樹(shù)算法Java實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09

最新評(píng)論