参考文档:http://blog.csdn.net/bigtree_3721/article/details/50448952

直接上代码说明

public class Main {
    //使用预编译
    //模式分别为子模式p1(.*)和子模式p2(12),其中p1中的量词匹配方式使用默认方式(贪婪模式)
    private static Pattern PG = Pattern.compile(".*12");

    //模式分别为子模式p1(.*)和子模式p2(12),其中p1中的量词匹配方式使用默认方式(勉强模式)
    private static Pattern PR = Pattern.compile(".*?12");

    //模式分别为子模式p1(.*)和子模式p2(12),其中p1中的量词匹配方式使用默认方式(占有模式)
    private static Pattern PP = Pattern.compile(".*+12");

    public static void main(String[] args) {
        //贪婪模式:
        //第一次匹配:吃入所有字符a12s%^&12去匹配子模式p1,匹配成功,但是这样就没有字符串去匹配子模式p2了。本轮匹配失败
        //第二次匹配:减少p1部分的匹配量,吐出最后一个字符,把字符串分割成a12s%^&1和2两个子字符串s1和s2。s1匹配p1,但s2不匹配p2。本轮匹配失败
        //第三次匹配:再次减少p1部分的匹配量,吐出两个字符,字符串被分割为a12s%^&和12两个子字符串s1和s2。s1/s2分别匹配p1/p2。停止尝试,返回true。
        Matcher m1 = PG.matcher("a12s%^&12");
        boolean b1 = m1.matches();
        System.out.println("b1: " + b1);    //返回:b1: true

        //勉强模式:
        //第一次匹配:p1由于是0或任意次,因此被忽略,用字符串去匹配p2,失败;本轮匹配失败。
        //第二次匹配:读入第一个字符a,尝试和p1匹配,匹配成功。剩余的字符串12s%^&12中前两个字符和p2也是匹配的。因此,停止尝试,返回true。
        Matcher m2 = PR.matcher("a12s%^&12");
        boolean b2 = m2.matches();
        System.out.println("b2: " + b2);   //返回:b2: true

        //占有模式
        //匹配开始时,读入所有字符串,和p1匹配成功,但没有剩余字符串去和p2匹配。因此匹配失败,返回false。
        Matcher m3 = PP.matcher("a12s%^&12");
        boolean b3 = m3.matches();
        System.out.println("b3: " + b3);   //返回:b3: false
    }
}


↙↙↙阅读原文可查看相关链接,并与作者交流