正則表達式的三種模式

概述:

正則表達式的匹配模式分爲三種:貪婪模式Greedy(默認)、勉強模式Reluctant侵佔模式Possessive。下面將會分別做出具體的講述。

貪婪模式:

在匹配的過程中,儘可能多的去選擇匹配內容,然後逐個遞減,直到匹配成功。
例如:待匹配字符串爲aweiaaaaaaaaaaaaawei,匹配正則表達式p0爲 “ .*wei ”。
首先p0可分爲,p1(.*)和子模式p2(wei)兩個部分. 其中p1中的量詞匹配方式使用默認方式(貪婪型)。
匹配過程:
1. 所有字符aweiaaaaaaaaaaaaawei匹配p1,匹配成功,剩餘空字符匹配p2,匹配失敗,整體匹配失敗。
2. 字符aweiaaaaaaaaaaaaawe匹配p1,匹配成功,剩餘字符 i匹配p2,匹配失敗,整體匹配失敗。
3. 字符aweiaaaaaaaaaaaaaw匹配p1,匹配成功,剩餘字符 ei匹配p2,匹配失敗,整體匹配失敗。
4. 字符aweiaaaaaaaaaaaaa匹配p1,匹配成功,剩餘字符 wei匹配p2,匹配成功,整體匹配成功。

public static void main(String[] args) {
        // TODO Auto-generated method stub
        String content = "aweiaaaaaaaaaaaaawei";
        String regex = ".*wei";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher =pattern.matcher(content);
        while(matcher.find()){
            System.out.println("匹配結果:"+matcher.group());

        }

    }

輸出:
匹配結果:aweiaaaaaaaaaaaaawei

勉強模式:

在匹配的過程中,首先儘可能少的去匹配,然後逐個增加,直到匹配成功。
例如:待匹配字符串爲aweiaaaaaaaaaaaaawei,匹配正則表達式p0爲 “ .*?wei ”。
首先p0可分爲,p1(.*?)和子模式p2(wei)兩個部分. 其中p1中的量詞匹配方式使用(勉強模式)。
1. 空字符匹配p1,匹配成功,字符aweiaaaaaaaaaaaaawei匹配p2,匹配失敗,整體匹配失敗。
2. 字符a匹配p1,匹配成功,字符weiaaaaaaaaaaaaawei匹配p2,匹配成功(wei),整體匹配成功。

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String content = "aweiaaaaaaaaaaaaawei";
        String regex = ".*?wei";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher =pattern.matcher(content);
        while(matcher.find()){
            System.out.println("匹配結果:"+matcher.group());

        }

    }

輸出:
匹配結果:awei
匹配結果:aaaaaaaaaaaaawei
說明:p2使用貪婪模式匹配,weiaaaaaaaaaaaaawei的匹配過程,weiaaaaaaaaaaaaawei匹配失敗,weiaaaaaaaaaaaaawe匹配失敗…直到wei匹配成功。最終匹配的結果是awei字符。

侵佔模式:

在匹配的過程中,儘可能多的去匹配,一旦匹配成功,就不會改變。
例如:待匹配字符串爲aweiaaaaaaaaaaaaawei,匹配正則表達式p0爲 “ .*+wei ”。
首先p0可分爲,p1(.*+)和子模式p2(wei)兩個部分. 其中p1中的量詞匹配方式使用(勉強模式)。
1. 字符aweiaaaaaaaaaaaaawei匹配p1,匹配成功,空字符匹配p2,匹配失敗,整體匹配失敗。

    public static void main(String[] args) {
        String content = "aweiaaaaaaaaaaaaawei";
        String regex = ".*+wei";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher =pattern.matcher(content);
        //matcher.matches()
        if(matcher.find()){
            System.out.println("匹配結果:"+matcher.group());

        }else{
            System.out.println("匹配失敗");
        }

    }

希望對您有所幫助!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章