(103)正则表达式(匹配、切割、替换、获取)、正则综合练习

正则表达式:符合一定规则的表达式
作用:用于专门操作字符串的表达式
好处:可以简化对字符串的复杂操作
弊端:符号定义越多,正则越长,阅读性差
特点:用特定的符号来代表一些代码操作,这样就简化了代码书写
学习正则表达式就是学习符号的应用方法
一、匹配 String matches方法
public boolean matches(String regex)

//不能以0开头、必须都是数字,位数5-15
        String str="1989m";
        String regex="[1-9]\\d{4,14}";
        boolean b=str.matches(regex);
        System.out.println(b);//false
//手机号码:13   15   18(只能包含数字且11位)
        String str="1333296245a";
        String regex="[1][3,5,8]\\d{9}";//若“\”出现,则“\\”
        boolean b=str.matches(regex);
        System.out.println(b);

二、切割
public String[] split(String regex)
public String[] split(String regex, int limit)

        String str="zhangsan   lisi  wangwu";
        String regex=" +";//规则是按照空格出现一次或者多次切割
        String[] arr=str.split(regex);
        for(String s:arr)
        {
            System.out.println(s);
        }
       String str="zhangsan.lisi.wangwu";
        String regex="\\.";//用.切割,因为"."在正则中有含义:代表任意字符,所以要对"."转义为"\."
        //在字符串中\又具有转义的作用,所以要再加个"\",这样正则中“\.”就是普通的“.”
        String[] arr=str.split(regex);
        for(String s:arr)
        {
            System.out.println(s);
        }   
       String  str="c:\\abc\\a.txt";
        String regex= "\\\\";//根据\\切割,切一个"\",要用"\\"
        String[] arr=str.split(regex);
        for(String s:arr)
        {
            System.out.println(s);
        }
       String  str="ahhhcidbvkkoccc";
        String regex= "(.)\\1+";
        //按照叠词切割,为了可以让规则的结果被重用,可以将规则封装成一个组,
        //用()完成,组的出现都有编号,从1开始,想要使用已有的组可以通过\n(n就是组的编号)
        //的形式来获取
        String[] arr=str.split(regex);
        for(String s:arr)
        {
            System.out.println(s);
        }       

三、替换
public String replaceAll(String regex, String replacement)

        String  str="wer8934605juowa89320571f";
        String regex= "\\d{5,}";//将连续5个以上数字替换成#
        String str1=str.replaceAll(regex, "#");
        System.out.println(str1); 
        String  str="cudddbhuuujddd";
        String regex= "(.)\\1+";//将多个重复字母替换成&
        String str1=str.replaceAll(regex, "&");
        System.out.println(str1);
        String  str="cudddbhuuujddd";
        String regex= "(.)\\1+";//将多个重复字母替换成一个字母
        String str1=str.replaceAll(regex, "$1");//$1就是获取叠词的第一个字母
        System.out.println(str1);

四、获取
操作步骤:
1,将正则表达式(规则)封装成对象
2,让正则对象和要操作的字符串相关联
3,关联后,获取正则匹配引擎
4,通过引擎对符合规则的自创进行操作,比如获取

       String str="min tian jiu yao fang jia le ,da jia。";

        String regex="\\b[a-z]{3}\\b";//"\b"是单词边界,获取长度为3的单词z子串
        Pattern p=Pattern.compile(regex);//将给定的正则表达式编译到模式中

        //将正则对象和要操作的字符串相关联,就获得了匹配引擎
        Matcher  m=p.matcher(str);

        //通过匹配引擎对符合规则的子串进行操作,比如取出

    /*  boolean b=m.find();//将规则作用到字符串上,并进行符合规则的子串的查找
        System.out.println(b);
        String sub=m.group();
        System.out.println(sub);
        类似集合中的迭代器,下一个相匹配的是否存在,存在输出该子串
    */

        while(m.find())
        {
            System.out.println(m.group());
            System.out.println(m.start()+"....."+m.end());end是结束字符的下一个字符位置
        }
//////////////////////////////////////////
 System.out.println(m.matches());//将规则作用在整个字符串上,相当于规则就是3个字母的单词,      
 //因为字符串长度>3,所以返回false,并且指针指向后移,在下面的寻找子串的过程中,不会输出“min”
  while(m.find())
        {
            System.out.println(m.group());
            System.out.println(m.start()+"....."+m.end());end是结束字符的下一个字符位置
        }

五、练习

需求一将“我我…我我…我要..要要…要要…学学学…学学…编编编..编程..程.程…程…程”——>”我要学编程”
到底用四种功能中的哪一个?或者哪几个?
1,如果只想知道该字符对错,用匹配
2,想要将已有的字符串变成里一个字符串,替换
3,想要按照自定的方式将字符串变成多个字符串,切割。(获取规则以外 的子串)
4,想要拿到符合需求的字符串子串,获取。(获取符合规则的子串)

        StringBuilder sb=new StringBuilder();
        String str="我我...我我...我要..要要...要要...学学学...学学...编编编..编程..程.程...程...程";
        //首先可以根据多个.切割,再将其合并成字符串
        String re="\\.+";
        String [] arr=str.split(re);
        for(String s:arr)
        {

            sb.append(s);
        }
        String str1=sb.toString();//我我我我我要要要要要学学学学学编编编编程程程程程
        上面的切割也可以用替换的方法
       /* //替换,现将.去掉
        String re="\\.+";
        String str1=str.replaceAll(re, "");
        System.out.println(str1);
       */
        //再按照叠词(.)\\1+,将重叠词去掉
        String re1="(.)\\1+";
        String str2=str1.replaceAll(re1, "$1");
        System.out.println(str2);

需求二 : 192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30 将ip地址进行地址段顺序的排序

        String ip="192.68.1.254  102.49.23.013  10.10.10.10  2.2.2.2 8.109.90.30";
        //由2.2.2.2,每段需要的0为2个,所以IP的每一段都补2个零,从而使得每段至少3个位
        String re="(\\d+)";//取多个数字,因为要获得其值,所以要包装成组
        ip=ip.replaceAll(re, "00$1");
        System.out.println(ip);

        //要进行比较大小的就是每段的后3位,在上面的加“0”过程中,例如192-->00192,所以要将多余的0去掉
        //0*:0含有零个或者多个,(\\d{3})取最低三位,因为0*已将每段的0取走,要获取最低三位,所有用组
        String re1="0*(\\d{3})";
        ip=ip.replaceAll(re1, "$1");
        System.out.println(ip);

        //将这个ip地址按照空格切割成字符数组
        String re2=" +";
        String [] arr=ip.split(re2);

        //下面进行排序,可以用Arrays.sort方法进行排序
        Arrays.sort(arr);
        //System.out.println(Arrays.toString(arr));
        //因为当前就是每段3位,002,这种需要替换一下,所以要在遍历过程中进行替换
        String re3="0*(\\d+)";
        for(String s:arr)
        {
            System.out.println(s.replaceAll(re3, "$1"));
        }

需求三:对邮件地址进行校验

String mail="SDGRGH@sina.com.cn";
String mail="SDGRGH@sina.com";
        String reg="[a-zA-Z0-9_]{6,12}@[a-zA-Z0-9_]+(\\.[a-zA-Z]+){1,3}";//用户名是大小写字母         
        //数字和下划线都可以,[]只是一位判断
        System.out.println(mail.matches(reg));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值