public class RegexDemo8 {
    public static void main(String[] args) {
        //分组:()
        //每组是有组号的,从左到右,从1开始
        //规则:从左往右,第几个左括号就是第几组
        //例如:(\\d(\\d))(\\d)第一个括号里的括号就是第二组

        //捕获分组
        //1.判断一个字符串的开始结束字符是否一致,只考虑一个字符
        String regex1="(.).+\\1";// \\N表示第N组的内容
        System.out.println("abc".matches(regex1));//false
        System.out.println("aba".matches(regex1));//true
        System.out.println("abcdefa".matches(regex1));//true
        System.out.println("abcasd".matches(regex1));//false

        //2.判断一个字符串的开始结束字符是否一致,可以是多个字符;例如abcyyyyabc  asdjlsla  $%^$$$$%^
        String regex2="(.+).+\\1";
        System.out.println("abcssssabc".matches(regex2));
        System.out.println("asdjlsla".matches(regex2));
        System.out.println("$%^$$$$%^".matches(regex2));
        System.out.println("$%^$$$$%^*".matches(regex2));

        //2.判断一个字符串的开始结束字符是否一致,可以是多个字符,且必须是一样的;例如abca  aahfskjfhsaa &&&fddsfjk&&&
        String regex3="((.)\\2*).+\\1";
        System.out.println("abca".matches(regex3));
        System.out.println("aahfskjfhsaa".matches(regex3));
        System.out.println("&&&fddsfjk&&&".matches(regex3));
        System.out.println("abcab".matches(regex3));

        //正则表达式内部用\\组号来表示
        //正则表达式外部用$组号来表示
        String str="我要学学编编编编编编程程程程程";
        //变为我要学编程
        String s1 = str.replaceAll("(.)\\1+", "$1");
        System.out.println(s1);//我要学编程

        //非捕获分组(仅仅只是分组不占用组号)   21043019760604644x
        //?: ?=   ?!都是非捕获分组
        String regex="[1-9]\\d{16}(?:\\d|X|x)";
        System.out.println("21043019760604644x".matches(regex));
        //?: :组合元素,不捕获匹配文本,不分配组号。
        //?= :正向预查,要求后面文本匹配指定模式。
        //?! :负向预查,要求后面文本不匹配指定模式。
    }
}