正则表达式的三种模式

概述:

正则表达式的匹配模式分为三种:贪婪模式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("匹配失败");
        }

    }

希望对您有所帮助!

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