正则表达式及其应用

demo1:

package 正则表达式;

public class demo1 {
    public static void main(String[] args) {
        //只能是a b c
        System.out.println("a".matches("[abc]"));//true
        //前后校验字符个数需要一致
        System.out.println("ab".matches("[abc]"));//false
        System.out.println("ab".matches("[abc][abc]"));//true
        System.out.println("--------------------------------------");
        //不能出现a b c
        System.out.println("a".matches("[^abc]"));//false
        System.out.println("d".matches("[^abc]"));//true
        System.out.println("zz".matches("[^abc][^abc]"));//true
        System.out.println("--------------------------------------");
        //a-z 或 A-Z()包括头尾范围
        System.out.println("a".matches("[a-zA-Z]"));//true
        System.out.println("zz".matches("[^a-z][^a-z]"));//false
        System.out.println("---------------------------------------");
        //[a-d[m-p]] a到d或者m到p
        System.out.println("a".matches("[a-z[A-Z]]"));//true
        System.out.println("zz".matches("[a-d[m-z]][a-d[m-z]]"));//true
        System.out.println("---------------------------------------");
        //[a-z&&[def]] a-z中同时包含d e f
        System.out.println("a".matches("[a-z&&[def]]"));//false
        System.out.println("d".matches("[a-z&&[def]]"));//true
        System.out.println("---------------------------------------");
        //[a-z&&[^bc]] a-z和非 b c 得交集
        System.out.println("a".matches("[a-z&&[^bc]]"));//true
        System.out.println("b".matches("[a-z&&[^bc]]"));//false
        System.out.println("---------------------------------------");
        //[a-z&&[^m-p]] a-z和除了m-p的交集 (等同于[a-lq-z])
        System.out.println("a".matches("[a-z&&[^m-p]]"));//true
        System.out.println("m".matches("[a-z&&[^m-p]]"));//false
        System.out.println("---------------------------------------");

        //[a-z&&[def]]
        //细节:如果要求两个范围的交集,那么需要写符号&&
        //如果写成了一个&,那么此时&表示就不是交集了,而是一个简简单单的&符号
        System.out.println("&".matches("[a-z&[def]]"));//true
    }
}

demo2:

package 正则表达式;

import java.util.StringJoiner;

public class demo2 {
    public static void main(String[] args) {
        //练习:以字符串的形式打印一个双引号
        //在Java中表示字符串的开头或者结尾
        //此时\表示转义字符,改变了后面那个双引号原本的含义
        //把他变成了一个普普通通的双引号而已。
        System.out.println("\"");
        // \表示转义字符
        //前面的\是一个转义字符,改变了后面\原本的含义,把他变成一个普普通通的\而己。
        System.out.println("F:\\Java学习\\代码\\myapi\\src\\正则表达式");

        // .表示任意一个字符
        System.out.println("你".matches("."));//true
        System.out.println("你好呀".matches(".."));//false
        System.out.println("----------------------------");
        //  \\d只能是任意的一位数字
        //  简单来记:两个\\表示一个\,一个\表示一个转义字符,一个d表示一个数字。
        System.out.println("123".matches("\\d"));//false
        System.out.println("123".matches("\\d\\d\\d"));//true
        System.out.println("----------------------------");
        // \\w只能是一位单词字符[a-zA-Z_0-9]
        System.out.println("a".matches("\\w"));//true
        System.out.println("A".matches("\\w"));//true
        System.out.println("_".matches("\\w"));//true
        System.out.println("0".matches("\\w"));//true
        System.out.println("----------------------------");
        // \\W(大写的)非单词字符
        System.out.println("a".matches("\\W"));//false
        System.out.println("你".matches("\\W"));//true
        System.out.println("----------------------------");
        //以上正则匹配只能校验单个字符


        //必须是 数字 字母 下划线,至少6位
        System.out.println("sunshine1990212".matches("\\w{6,}"));//true
        System.out.println("sun".matches("\\w{6,}"));//false
        System.out.println("----------------------------");
        //必须是数字和字符 必须是4位
        System.out.println("23df".matches("[a-zA-Z0-9]{4}"));//true
        System.out.println("23_f".matches("[a-zA-Z0-9]{4}"));//false
        System.out.println("23df".matches("[\\w&&[^_]]{4}"));//true
        System.out.println("23_f".matches("[\\w&&[^_]]{4}"));//false


    }
}

demo3:

package 正则表达式;

public class demo3 {
    public static void main(String[] args) {
//        请编写正则表达式验证用户输入的手机号码是否满足要求。
//        请编写正则表达式验证用户输入的邮箱号是否满足要求。
//        请编写正则表达式验证用户输入的电话号码是否满足要求。
//        验证手机号码 13112345678 1371234566713945679027139456790271
//        验证座机电话号码 020-2324242 02122442027-42424 0712-3242434
//        验证邮箱号码 3232323@q9.com zhangsan@itcast.cnn dlei0009@163.com dlei0009@pci.com.cn

        //心得:
        //拿着一个正确的数据,从左到右依次去写。

        //13112345678
        //分成三部分:
        //第一部分:1表示手机号码只能以1开头
        //第二部分:[3-9]表示手机号码第二位只能是3-9之间的
        //第三部分:\\d{9}表示任意数字可以出现9次,也只能出现9次
        String regex1 = "1[3-9]\\d{9}";
        boolean matches = "13112345678".matches(regex1);
        System.out.println(matches);
        System.out.println("-------------------------------------------------");


        //座机电话号码
        //020-2324242 02122442 027-42424
        //思路:
        //在书写座机号正则的时候需要把正确的数据分为三部分
        //一:区号 @\\d{2,3}s 0:表示区号一定是以0开头的
        // \\d{2,3}:表示区号从第二位开始可以是任意的数字,可以出现2到3次。
        //二:-?表示次数,@次或一次
        //三:号码:号码的第一位也不能以8开头,从第二位开始可以是任意的数字,号码的总长度:5-10位
        String regex2 = "0\\d{2,3}-?[1-9]\\d{4,9}";
        boolean matches1 = "02112442".matches(regex2);
        System.out.println(matches1);
        System.out.println("-------------------------------------------------");

        //邮箱号码
        //3232323@qq.com    zhangsan@itcast.cnn     dlei0009@163.com    dleie0e9@pci.com.cn
        //思路:
        //在书写邮箱号码正则的时候需要把正确的数据分为三部分
        //第一部分:@的左边\\w+
        //任意的字母数字下划线,至少出现一次就可以了
        //第二部分:@ 只能出现一次
        //第三部分:
        //          3.1  .的左边[\\w&&[^_]]{2,6}
        //          任意的字母加数字,总共出现2-6次(此时不能出现下划线)
        //          3.2  . \\.(单个的.代表任意字符,需转义)
        //大写字母,小写字母都可以,只能出现2-3次[a-zA-z]{2,3}
        //我们可以把3.2和3.3看成一组,这一组可以出现1次或者两次
        String regex3 = "\\w+@[\\w&&[^_]]{2,6}(\\.[a-zA-Z]{2,3}){1,2}";
        System.out.println("3232323@qq.com".matches(regex3));
        System.out.println("zhangsan@itcast.cnn".matches(regex3));
        System.out.println("dlei0009@163.com".matches(regex3));
        System.out.println("dleie0e9@pci.com.cn".matches(regex3));
        System.out.println("-------------------------------------------------");
        //忽略大小写的书写方式
        //在匹配的时候忽略abc的大小写
        //(?i)abc :代表abc忽略大小写
        String regex4 = "a((?i)b)c";//只忽略b的大小写
        System.out.println("abc".matches(regex4));
        System.out.println("ABC".matches(regex4));
        System.out.println("aBc".matches(regex4));
        System.out.println("-------------------------------------------------");

        //身份证号码的严格校验
        //编写正则的小心得:
        //第一步:按照正确的数据进行拆分
        //第二步:找每一部分的规律,并编写正则表达式
        //第三步:把每一部分的正则拼接在一起,就是最终的结果
        //书写的时候:从左到右去书写。
        //410801   1993 02 28 457x
        //前面6位:省份,市区,派出所等信息第一位不能是0,后面5位是任意数字        [1-9]\\d{5}
        //年的前半段:18 19 20                                            (18|19|20)
        //年的后半段:任意数字出现两次                                       \\d{2}
        //月份:01 ~09 10 11 12                                          (0[1-9]|1[0-2])
        //日期:01~09  10~19 20~29 30 31                                 (0[1-9]|[12]\\d|3[01])
        //后面四位:任意数字出现3次 最后一位可以是数字也可以是大写x或者小写x        \\d{3}[\\dxx]

        String regex6 ="[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[\\dXx]";
        System.out.println("41080119930228457x".matches(regex6));
    }
}

应用–爬虫:

demo1:

package 爬虫;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class demo1 {
    public static void main(String[] args) {
        String str = "Java自从95年问世以米,经历了很多版本,目前企业中用的最多的是Java8和Java11,因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会遂渐登上历史舞台";
        //Pattern:表示正则表达式
        //Matcher:文本匹配器,作用按照正则表达式的规则去读取字符串,从头开始读取。
        //在大串中去找符合匹配规则的子串。
        //获取正则表达式的对象
        Pattern p = Pattern.compile("Java\\d{0,2}");
        //获取文本匹配器的对象
        //拿着m去读取str,找符合p规则的子串
        Matcher m = p.matcher(str);
        //拿着文本匹配器从头开始读取,寻找是否有满足规则的子串
        //如果没有,方法返回false
        //如果有,返回true。在底层记录子串的起始索引和结束索引+1
        while (m.find()) {
            //方法底层会根据find方法记录的索引进行字符串的截取
            // substring(起始索引,结束索引);包头不包尾
            // (0,4)但是不包含4索引
            // 会把截取的小串进行返回。
            String s = m.group();
            System.out.println(s);
        }
    }
}

demo2:

package 爬虫;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class demo2 {
    public static void main(String[] args) {
        //需求:把下面文本中的座机电话,邮箱,手机号,热线都爬取出来。来黑马程序员学习Java,
        //手机号:18512516758,18512508907
        //或者联系邮箱:boniu@itcast.cn
        //座机电话:01036517895,010-98951256
        //邮箱:bozai@itcast.cn,
        //热线电话:400-618-9090,400-618-4000,4006184000,4006189090

        //手机号正则表达式:1[3-9]\\d{9}
        //邮箱正则表达式:  \w+@[\w&&[^_]]{2,6}(\.[a-zA-Z]{2,3}){1,2}
        //座机电话   0\d{2,3}-?[1-9]\d{4,9}
        //热线电话:400-?618-?[1-9]\\d{3}

        String s="来黑马程序员学习Java,"+
                "电话:18512516758,18512508907"+"或者联系邮箱:boniu@itcast.cn,"+
                "座机电话:01036517895,010-98951256"+
                "邮箱:bozai@itcast.cn,"+
                "热线电话:400-618-9090,400-618-4000,4006184000,4006189090";
        String regex = "(1[3-9]\\d{9})|(\\w+@[\\w&&[^_]]{2,6}(\\.[a-zA-Z]{2,3}){1,2})|(0\\d{2,3}-?[1-9]\\d{4,9})|(400-?618-?[1-9]\\d{3})";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(s);
        while (matcher.find()){
            matcher.group();
            System.out.println(matcher.group());
        }

    }
}

demo3:

package 爬虫;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class demo3 {
    public static void main(String[] args) {
        //需求1:爬取版本号为8,11,17的Java文本,但是只要Java,不显示版本号。
        //需求2:爬取版本号为8,11,17的lava文本。正确爬取结果为:java8java11java17java17
        //需求3:爬取除了版本号为8,11,17的Java文本

        String s= "Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11,因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";

        //1.定义正则表达式
        //?理解为前面的数据Java
        //=表示在Java后面要随的数据
        //但是在获取的时候,只获取前半部分

        //需求1:(获取前面部分)
        String regex1 = "Java(?=8|11|17)";
        //需求2:(获取所有)
        String regex2 = "Java(?:8|11|17)";
        //需求3:(获取不是指定内容的前面部分)
        String regex3 = "Java(?!8|11|17)";
        Pattern p = Pattern.compile(regex3);
        Matcher m = p.matcher(s);
        while (m.find()){
            System.out.println(m.group());
        }
    }
}

demo4:

package 爬虫;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class demo4 {
    public static void main(String[] args) {
        //有如下文本,请按照要求爬取数据。
        //Java自从95年问世以来,abbbbbbbbbbbbaaaaaaaaaaaaaaaaaa经历了很多版本,
        //目前企业中用的最多的是ava8和Java11,因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台
        //需求1:按照ab+的方式爬取ab,b尽可能多获取
        //需求2:按照ab+的方式爬取ab,b尽可能少获取

//        只写+和*表示贪婪匹配
//        +? 非贪婪匹配
//        *? 非贪婪匹配
//        贪婪爬取:在爬取数据的时候尽可能的多获取数据
//        非贪婪爬取:在爬取数据的时候尽可能的少获取数据
//        ab+:
//        贪婪爬取:abbbbbbbbbbbb
//        非贪婪爬取:ab

        String str = "Java自从95年问世以来,abbbbbbbbbbbbaaaaaaaaaaaaaaaaaa经历了很多版本,目前企业中用的最多的是ava8和Java11,因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";
        String reg = "ab+?";
        Pattern p = Pattern.compile(reg);
        Matcher m = p.matcher(str);
        while (m.find()){
            System.out.println(m.group());
        }
    }
}

demo5

package 爬虫;

public class demo5 {
    public static void main(String[] args) {
        //public string replaceAll(string regex,string newstr)
        // public string[] split(string regex):


        //按照正则表达式的规则进行替换按照正则表达式的规则切割字符串
        //有一段字符串:小诗诗dqwefqwfqwfwg12312小丹丹dqwefqwfqwfwg12312小惠惠

        // 要求1:把字符串中三个姓名之间的字母替换为vs
        // 要求2:把字符串中的三个姓名切割出来

        String str = "小诗诗dqwefqwfqwfwg12312小丹丹dqwefqwfqwfwg12312小惠惠";
        String s = str.replaceAll("[\\w&&[^_]]{1,}", "vs");
        System.out.println(s);

        String[] split = str.split("[\\w&&[^_]]{1,}");
        for (int i = 0; i < split.length; i++) {
            System.out.print(split[i]+" ");
        }
    }
}

demo6:

package 爬虫;

public class demo6 {
    public static void main(String[] args) {
        //需求1:判断一个字符串的开始字符和结束字符是否一致?只考虑一个字符
        //举例:a123a b456b   17891   &abc&
        //使用正则表达式"(.).+.\\1",其中(.)匹配首字符并将其作为一个分组,.+匹配中间任意字符,\\1表示匹配与首字符相同的字符。
        String regex1 = "(.).+\\1";
        System.out.println("a123a".matches(regex1));
        System.out.println("b456b".matches(regex1));
        System.out.println("17891".matches(regex1));
        System.out.println("&abc&".matches(regex1));
        System.out.println("a123b".matches(regex1));
        System.out.println("--------------------------------------");
        //需求2:判断一个字符串的开始部分和结束部分是否一致?可以有多个字符
        // 举例:abc123abc b456b   123789123   &!@abc&!@
        //使用正则表达式"(.+).+\\1",其中(.+)匹配开始部分并作为一个分组,.+匹配中间任意字符,\\1表示匹配与开始部分相同的字符。
        String regex2 = "(.+).+\\1";
        System.out.println("abc123abc".matches(regex2));
        System.out.println("123789123".matches(regex2));
        System.out.println("&!@abc&!@".matches(regex2));
        System.out.println("1&!@abc&!@".matches(regex2));
        System.out.println("--------------------------------------");
        //需求3:判断一个字符串的开始部分和结束部分是否一致?开始部分内部每个字符也需要一致
        // 举例:aaa123aaa bbb456bbb 111789111 &&abc&&

        //(.):把首字母看做一组
        //  \\2:把首字母拿出来再次使用
        // *:作用于\\2,表示后面重复的内容出现0次或多次
        //使用正则表达式"((.)\\2*).+\\1",其中((.)\\2*)匹配开始部分并作为一个分组,其中(.)匹配首字符并作为一个子分组,\\2*表示匹配与首字符相同的字符0次或多次,.+匹配中间任意字符,\\1表示匹配与开始部分相同的字符。
        String regex3 = "((.)\\2*).+\\1";
        System.out.println("aaa123aaa".matches(regex3));
        System.out.println("bbb456bbb".matches(regex3));
        System.out.println("111789111".matches(regex3));
        System.out.println("&&abc&&".matches(regex3));
        System.out.println("123789123".matches(regex3));
    }
}

demo7:

package 爬虫;

public class demo7 {
    public static void main(String[] args) {
        /*需求:将字符串:我要学学编编编编程程程程程程替换为:我要学编程*/

        String str = "我要学学编编编编程程程程程程";

        //需求:把重复的内容 替换为单个的
        //(.)表示把重复内容的第一个字符看做一组
        //\\1 表示第一字符再次出现
        //+至少一次
        //$1表示把正则表达式中第一组的内容,再拿出来用
        String newStr = str.replaceAll("(.)\\1+","$1");
        System.out.println(newStr);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值