溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java正則表達(dá)式中Pattern類與Matcher類有什么區(qū)別

發(fā)布時(shí)間:2021-07-01 16:31:35 來源:億速云 閱讀:274 作者:Leah 欄目:編程語言

本篇文章為大家展示了Java正則表達(dá)式中Pattern類與Matcher類有什么區(qū)別,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

Pattern類說明

指定為字符串的Java正則表達(dá)式必須首先被編譯為pattern類的實(shí)例。然后,可將得到的模式用于創(chuàng)建 Matcher 對(duì)象,依照J(rèn)ava正則表達(dá)式,該對(duì)象可以與任意字符序列匹配。執(zhí)行匹配所涉及的所有狀態(tài)都駐留在匹配器中,所以多個(gè)匹配器可以共享同一模式。

因此,典型的調(diào)用順序是

Pattern p = Pattern.compile("a*b");  Matcher m = p.matcher("aaaaab");  boolean b = m.matches();

在僅使用一次正則表達(dá)式時(shí),可以方便地通過pattern類定義 matches 方法。此方法編譯表達(dá)式并在單個(gè)
調(diào)用中將輸入序列與其匹配。語句
boolean b = Pattern.matches("a*b", "aaaaab");

等效于上面的三個(gè)語句,盡管對(duì)于重復(fù)的匹配而言它效率不高,因?yàn)樗辉试S重用已編譯的模式。
此類的實(shí)例是不可變的,可供多個(gè)并發(fā)線程安全使用。Matcher 類的實(shí)例用于此目的則不安全。

Matcher類說明

通過調(diào)用模式的 matcher 方法從模式創(chuàng)建匹配器。創(chuàng)建匹配器后,可以使用它執(zhí)行三種不同的匹配操作:

1  matches   方法嘗試將整個(gè)輸入序列與該模式匹配。

(注:當(dāng)調(diào)用String的matches()方法時(shí),實(shí)際上是調(diào)用Pattern的靜態(tài)方法matches().也就是相當(dāng)于調(diào)Matcher的matches(),所以是整個(gè)輸入序列與模式匹配.)

2  lookingAt  嘗試將輸入序列從頭開始與該模式匹配。

3  find     方法掃描輸入序列以查找與該模式匹配的下一個(gè)子序列。 

此類的實(shí)例用于多個(gè)并發(fā)線程是不安全的。

測(cè)試代碼

package test;  

  1. import java.util.regex.Matcher;     

  2. import java.util.regex.Pattern;     

  3. /**     

  4.  * java中運(yùn)用正則表達(dá)式的兩個(gè)重要類:Pattern與Matcher     

  5.  * @author fhd001     

  6.  */     

  7. public class PatternAndMatcherTest {     

  8.      public static void main(String[] args) {     

  9.         /*     

  10.          * 常用的調(diào)用     

  11.          */     

  12.         Pattern p1 = Pattern.compile("a*b");     

  13.         String str1 = "aaaab";     

  14.         Matcher m1 = p1.matcher(str1);     

  15.         boolean b1 = m1.matches();     

  16.         System.out.println(b1);     

  17.              

  18.         String str2 = "b";     

  19.         Matcher m2 = p1.matcher(str2);     

  20.         boolean b2 = m2.matches();     

  21.         System.out.println(b2);     

  22.          /*     

  23.          * 另一種調(diào)用     

  24.          * 等效于上面的語句,盡管對(duì)于重復(fù)的匹配而言它效率不高,因?yàn)樗辉试S重用已編譯的模式。      

  25.          * 但它可供多個(gè)并發(fā)線程安全使用,而上面的調(diào)用則就不是安全的.     

  26.          */     

  27.         boolean b3 = Pattern.matches("a*b", "aaab");     

  28.         System.out.println(b3);     

  29.              

  30.         //Pattern類的pattern方法:從pattern類的實(shí)例中返回匹配模式的字符串表示     

  31.         String pattern1 = p1.pattern();     

  32.         System.out.println(pattern1);     

  33.              

  34.         //Pattern類的split方法     

  35.         String[]arr1 = p1.split("rrrrraaabccccaaaaab");     

  36.         for (String string : arr1) {     

  37.             System.out.println(string+">>>>");     

  38.         }     

  39.         /*     

  40.          * Matcher類     

  41.          *      

  42.          * matches方法:       方法嘗試將整個(gè)輸入序列與該模式匹配     

  43.          * lookingAt方法: 嘗試將輸入序列從頭開始與該模式匹配,與 matches 方法類似,     

  44.          *                  此方法始終從區(qū)域的開頭開始;與之不同的是,它不需要匹配整個(gè)區(qū)域。      

  45.          * find方法:          方法掃描輸入序列以查找與該模式匹配的下一個(gè)子序列     

  46.          */     

  47.         String str3 = "aabbcccaaaaaeeeaaaaaaaaagggga";     

  48.         Pattern p3 = Pattern.compile("a+");     

  49.         Matcher m3 = p3.matcher(str3);     

  50.         boolean bo4 = m3.matches();     

  51.         System.out.println("matches方法:  "+bo4);     

  52.         /*     

  53.          * lookingAt方法,從開頭***個(gè)字符進(jìn)行匹配,匹配成功了不再繼續(xù)匹配,     

  54.          * 從***個(gè)字符開始,匹配失敗了,也不繼續(xù)匹配.不需要匹配整個(gè)序列     

  55.          */     

  56.         boolean bo5 = m3.lookingAt();     

  57.         if(bo5){     

  58.             //group方法(不帶參數(shù))返回的就是匹配的子字符串.     

  59.             System.out.println("lookingAt方法:  "+m3.group());     

  60.         }     

  61.      //find方法:找到一個(gè)匹配的子串,還會(huì)繼續(xù)找下一個(gè)子串.     

  62.         while(m3.find()){     

  63.             System.out.println("find方法:  "+m3.group());     

  64.         }     

  65.     /*     

  66.          * 帶參數(shù)的group方法與不帶參數(shù)的group方法區(qū)別     

  67.          * 不帶參數(shù)的group方法:find方法與lookingAt方法匹配出來的子序列(上面有演示)     

  68.          * 帶參數(shù)的group方法: 返回在以前匹配操作期間由給定組捕獲的輸入子序列。     

  69.          */     

  70.         String str6 = "aaabbbccc";     

  71.         Pattern p5 = Pattern.compile("(a+)(b+)(c+)");     

  72.         Matcher m5 = p5.matcher(str6);     

  73.         boolean boo = m5.matches();     

  74.         if(boo){     

  75.             int k = m5.groupCount()+1;//加1就是把0下標(biāo)的整個(gè)字符序列加上,它也作為一組放在0下標(biāo)的位置.     

  76.             if(k>0){     

  77.                 for(int i=0;i                    System.out.println(m5.group(i));     

  78.                 }     

  79.             }     

  80.         }     

  81.     }     

  82. }    

  83.  

  84. package test;  

  85.  

  86. import java.util.regex.Matcher;  

  87. import java.util.regex.Pattern;  

  88.  

  89. /**  

  90.  * java中運(yùn)用正則表達(dá)式的兩個(gè)重要類:Pattern與Matcher  

  91.  * @author fhd001  

  92.  */  

  93. public class PatternAndMatcherTest {  

  94.  

  95.  public static void main(String[] args) {  

  96.     

  97.   /*  

  98.    * 常用的調(diào)用  

  99.    */  

  100.     

  101.   Pattern p1 = Pattern.compile("a*b");  

  102.     

  103.   String str1 = "aaaab";  

  104.   Matcher m1 = p1.matcher(str1);  

  105.   boolean b1 = m1.matches();  

  106.   System.out.println(b1);  

  107.     

  108.   String str2 = "b";  

  109.   Matcher m2 = p1.matcher(str2);  

  110.   boolean b2 = m2.matches();  

  111.   System.out.println(b2);  

  112.  /*  

  113.    * 另一種調(diào)用  

  114.    * 等效于上面的語句,盡管對(duì)于重復(fù)的匹配而言它效率不高,因?yàn)樗辉试S重用已編譯的模式。   

  115.    * 但它可供多個(gè)并發(fā)線程安全使用,而上面的調(diào)用則就不是安全的.  

  116.    */  

  117.   boolean b3 = Pattern.matches("a*b", "aaab");  

  118.   System.out.println(b3);  

  119.     

  120.   //Pattern類的pattern方法:從pattern類的實(shí)例中返回匹配模式的字符串表示  

  121.   String pattern1 = p1.pattern();  

  122.   System.out.println(pattern1);  

  123.     

  124.   //Pattern類的split方法  

  125.   String[]arr1 = p1.split("rrrrraaabccccaaaaab");  

  126.   for (String string : arr1) {  

  127.    System.out.println(string+">>>>");  

  128.   }  

  129.   /*  

  130.    * Matcher類  

  131.    *   

  132.    * matches方法:  方法嘗試將整個(gè)輸入序列與該模式匹配  

  133.    * lookingAt方法: 嘗試將輸入序列從頭開始與該模式匹配,與 matches 方法類似,  

  134.    *      此方法始終從區(qū)域的開頭開始;與之不同的是,它不需要匹配整個(gè)區(qū)域。   

  135.    * find方法:   方法掃描輸入序列以查找與該模式匹配的下一個(gè)子序列  

  136.    */  

  137.   String str3 = "aabbcccaaaaaeeeaaaaaaaaagggga";  

  138.   Pattern p3 = Pattern.compile("a+");  

  139.   Matcher m3 = p3.matcher(str3);  

  140.   boolean bo4 = m3.matches();  

  141.   System.out.println("matches方法:  "+bo4);  

  142.    /*  

  143.    * lookingAt方法,從開頭***個(gè)字符進(jìn)行匹配,匹配成功了不再繼續(xù)匹配,  

  144.    * 從***個(gè)字符開始,匹配失敗了,也不繼續(xù)匹配.不需要匹配整個(gè)序列  

  145.    */  

  146.   boolean bo5 = m3.lookingAt();  

  147.   if(bo5){  

  148.    //group方法(不帶參數(shù))返回的就是匹配的子字符串.  

  149.    System.out.println("lookingAt方法:  "+m3.group());  

  150.   }  

  151.    //find方法:找到一個(gè)匹配的子串,還會(huì)繼續(xù)找下一個(gè)子串.  

  152.   while(m3.find()){  

  153.    System.out.println("find方法:  "+m3.group());  

  154.   }  

  155.    /*  

  156.    * 帶參數(shù)的group方法與不帶參數(shù)的group方法區(qū)別  

  157.    * 不帶參數(shù)的group方法:find方法與lookingAt方法匹配出來的子序列(上面有演示)  

  158.    * 帶參數(shù)的group方法: 返回在以前匹配操作期間由給定組捕獲的輸入子序列。  

  159.    */  

  160.   String str6 = "aaabbbccc";  

  161.   Pattern p5 = Pattern.compile("(a+)(b+)(c+)");  

  162.   Matcher m5 = p5.matcher(str6);  

  163.   boolean boo = m5.matches();  

  164.   if(boo){  

  165.    int k = m5.groupCount()+1;//加1就是把0下標(biāo)的整個(gè)字符序列加上,它也作為一組放在0下標(biāo)的位置.  

  166.    if(k>0){  

  167.     for(int i=0;i     System.out.println(m5.group(i));  

  168.     }  

  169.    }  

  170.   }  

  171.  }  


結(jié)果代碼

true     true     true     a*b     rrrrr>>>>     cccc>>>>     matches方法:  false     lookingAt方法:  aa     find方法:  aaaaa     find方法:  aaaaaaaaa     find方法:  a     aaabbbccc     aaa     bbb     ccc

上述內(nèi)容就是Java正則表達(dá)式中Pattern類與Matcher類有什么區(qū)別,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI