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

来源:互联网 发布:人工智能和arvr 编辑:程序博客网 时间:2024/06/05 11:01

正则表达式:符合一定规则的表达式
作用:用于专门操作字符串的表达式
好处:可以简化对字符串的复杂操作
弊端:符号定义越多,正则越长,阅读性差
特点:用特定的符号来代表一些代码操作,这样就简化了代码书写
学习正则表达式就是学习符号的应用方法
一、匹配 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));
阅读全文
0 0