正则表达式

发布时间 2023-03-23 21:10:22作者: lifeBug

作用:校验字符串是否满足规则

 

 

 

 

转义字符  \  改变后面那个字符原本的含义

//请编写正则表达式验证身份证号码是否满足要求。
        //简单要求:18位,前17位任意数字,最后一位可以是数字可以是大写或小写的x

        String regex="[1-9]\\d{16}(\\d|X|x)";
        System.out.println("15040119810705387x".matches(regex));  //true
        System.out.println("130133197204039024".matches(regex));  //true

 

在一段文本中查找满足要求的内容

//有如下文本,请按照要求爬取数据。
        //Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11,
        //因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台
        //要求:找出里面所有的Javaxx
        String str="Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11,因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";

        //获取正则表达式对象
        Pattern p=Pattern.compile("Java\\d{0,2}");
        //获取文本匹配器对象
        //拿着matcher去读取str,找到符合p规则的子串
        Matcher matcher = p.matcher(str);
        //利用循环获取
        while (matcher.find()){
            System.out.println(matcher.group());  //输出:Java  Java8  Java11 Java17 Java17
        }

带条件爬取

//带条件爬取
        String regex1="((?i)Java)(?=8|11|17)"; // 输出4个Java
        // 解释 (?i)表示忽略大小写 ? 理解为前面的数据 = 表示在Java后面要跟随的数据  但是获取时候只获取前半部分


        String regex2="((?i)Java)(?:8|11|17)";  //输出Java8  Java11  Java17  Java17
        // : 表示获取的时候获取整体

        String regex3="((?i)Java)(?!8|11|17)";  //输出Java
        // ! 表示查找符合去除后面的数字的Java

贪婪爬取和非贪婪爬取

String str1="abbbbbbbbbbbbbbbbbbbbbbcccccccccccccc";
        //贪婪爬取 尽可能多的获取数据
        String regex="ab+";  //abbbbbbbbbbbbbbbbbbbbbb
        //非贪婪爬取 尽可能少获取数据
        String regex5="ab+?";  //ab

方法

 

 

//替换
        String str="张三afvde213李四gnrji31王五";
        String regex="[\\w&&[^_]]+";
        String vs = str.replaceAll(regex, "VS");
        System.out.println(vs);
        //切割
        String[] arr = str.split(regex);
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);  //张三 李四 王五
        }

 

分组

分组就是一个小括号

每组是有组号的,也就是序号。

规则1:从1开始,连续不间断。

规则2:以左括号为基准,最左边的是第一组,其次是第二组,以此类推

捕获分组

  就是把这一组中的数据捕获出来,再用一次

  正则内部使用:\\组号

//需求1:判断一个字符串的开始字符和结束字符是否一致?只考虑一个字符
        // 举例: a123a b456b 17891 &abc&
        String regex1="(.).+\\1";
        System.out.println("a123a".matches(regex1));  //true
        System.out.println("a123b".matches(regex1));  //false

        //需求2:判断一个字符串的开始部分和结束部分是否一致?可以有多个字符
        // 举例: abc123abc b456b 123789123 &!@abc&!@
        String regex2="(.+).+\\1";
        System.out.println("abc123abc".matches(regex2));  //true
        System.out.println("123789122".matches(regex2));  //false

        //需求3:判断一个字符串的开始部分和结束部分是否一致?开始部分内部每个字符也需要一致
        //举例: aaa123aaa bbb456bbb 111789111 &&abc&&
        String regex3="((.)\\2*).+\\1";
        //(.):把首字母看做一组
        // \\2:把首字母拿出来再次使用 2是因为首字母是第二组
        //  *:作用于\\2,表示后面重复的内容出现0次或多次
        System.out.println("aaa123aaa".matches(regex3));  //true
        System.out.println("bbb456bbc".matches(regex3));  //false

正则外部使用:$组号

//将字符申:我要学学编编编编程程程程程程替换为:我要学编程
        String str1="我要学学编编编编程程程程程程";
        String regex="(.)\\1+";
        //(.)表示把重复内容的第一个字符看做一组
        // \\1表示第一个字符再次出现
        //+ 至少一次
        String result = str1.replaceAll(regex, "$1");
        //$1 表示把正则表达式中第一组的内容,再拿出来用
        System.out.println(result);   //我要学编程

非捕获分组

  分组之后不需要再用本组数据,仅仅是把数据括起来

 

 注:(?:)(?=)(?!)都是非捕获分组

String str="41080119930228457×";
        
        //非捕获分组特点不占用组号
        String regex="[1-9]\\d{16}(?:\\d|X|x)"; 
        String regex1="[1-9]\\d{16}(?:\\d|X|x)\\1"; //  \\1会报错 (?:)是非捕获分组,此时是不占用组号的,\\1找不到分组
        System.out.println(str.matches(regex1));