java中的pattern和matcher的用法

今天要分享的內容是java語言中的pattern和matcher的用法

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)

組0始終代表整個表達式。

詳解Pattern類

Pattern類用於創建一個正則表達式,也可以說創建一個匹配模式,它的構造方法是私有的,不可以直接創建,但可以通過Pattern.complie(String regex)簡單工廠方法創建一個正則表達式, 
Java代碼示例: 
Pattern p=Pattern.compile("\\w+"); 
p.pattern();//返回 \w+ 

詳解Matcher類

說了這麼多,終於輪到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對象的創建的 

注意看下面這個例子,pattern方法返回的值

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class StringPattern {

    public static void main(String[] args) {
        Pattern p = Pattern.compile("\\d+");
        Matcher m = p.matcher("22bb23");
        Pattern pattern = m.pattern();//返回p 也就是返回該Matcher對象是由哪個Pattern對象的創建的
        String pattern1 = pattern.pattern();
        System.out.println(pattern1);//\d+
    }
}

Matcher.matches()/ Matcher.lookingAt()/ Matcher.find()區別

  1. Matcher類提供三個匹配操作方法,三個方法均返回boolean類型,當匹配到時返回true,沒匹配到則返回false
    matches()對整個字符串進行匹配,只有整個字符串都匹配了才返回true
  2. lookingAt()對前面的字符串進行匹配,只有匹配到的字符串在最前面才返回true
  3. find()對字符串進行匹配,匹配到的字符串可以在任何位置.

Mathcer.start()/ Matcher.end()/ Matcher.group()

  1. 當使用matches(),lookingAt(),find()執行匹配操作後,就可以利用以上三個方法得到更詳細的信息.
  2. start()返回匹配到的子字符串在字符串中的索引位置.
  3. end()返回匹配到的子字符串的最後一個字符在字符串中的索引位置.
  4. group()返回匹配到的子字符串
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class StringPattern {

    public static void main(String[] args) {
        Pattern p=Pattern.compile("([a-z]+)(\\d+)");
        Matcher m=p.matcher("aaa2223bb");
        System.out.println(m.find());   //匹配aaa2223

        System.out.println(m.groupCount());  //返回2,因爲有2組
        System.out.println(m.start(1));   //返回0 返回第一組匹配到的子字符串在字符串中的索引號
        System.out.println(m.start(2));   //返回3
        System.out.println(m.end(1));   //返回3 返回第一組匹配到的子字符串的最後一個字符在字符串中的索引位置.
        System.out.println(m.end(2));   //返回7
        System.out.println(m.group(1));   //返回aaa,返回第一組匹配到的子字符串
        System.out.println(m.group(2));;   //返回2223,返回第二組匹配到的子字符串
    }
}

find比較特殊,特此說明

find
1. public boolean find()嘗試查找與該模式匹配的輸入序列的下一個子序列。
此方法從匹配器區域的開頭開始,如果該方法的前一次調用成功了並且從那時開始匹配器沒有被重置,則從以前匹配操作沒有匹配的第一個字符開始。
如果匹配成功,則可以通過 start、end 和 group 方法獲取更多信息。
2. 返回:
當且僅當輸入序列的子序列匹配此匹配器的模式時才返回 true。

因此有下面這種,循環find的用法

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class StringPattern {

    public static void main(String[] args) {
        Pattern p=Pattern.compile("\\d+");
        Matcher m=p.matcher("我的QQ是:123 我的電話是:456 我的郵箱是:[email protected]");
        while(m.find()) {
            System.out.println(m.group());
        }
    }
}

最後強調

現在大家應該知道,每次執行匹配操作後start(),end(),group()三個方法的值都會改變,改變成匹配到的子字符串的信息,以及它們的重載方法,也會改變成相應的信息.
注意:只有當匹配操作成功,纔可以使用start(),end(),group()三個方法,否則會拋出java.lang.IllegalStateException,也就是當matches(),lookingAt(),find()其中任意一個方法返回true時,纔可以使用.

發佈了107 篇原創文章 · 獲贊 8 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章