39.正则表达式

Posted 重庆刘亦菲

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了39.正则表达式相关的知识,希望对你有一定的参考价值。

正则表达式:符合一定规则的表达式
作用:用于专门操作字符串
特点:用一些特定的符号来表示一些代码操作,简化书写
好处:简化对字符串的复杂操作
弊端:符号定义越多,正则越长,阅读性越差。

具体操作功能:
1.匹配:String matches方法。用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false
2.切割:String split() 返回规则以外的字符串
3.替换:String replaceAll()

public class ZhengZe_01 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        //checkQQ();
        
        //demo();
        
        //checkTel();
        
        //splitDemo();
        
        replaceAllDemo();
    }
    
    public static void demo(){
        String str="a";
        String reg="[bcd]"; //第一个字符只能是bcd中一个
        boolean b=str.matches(reg);
        System.out.println(b);
    }

    public static void checkQQ(){
        
        /*
        对QQ号进行校验
        要求:5~15位,0不能开头,只能是数字
         */
        String qq="12434243";
        String regex="[1-9][0-9]{4,14}";
        
        boolean flag=qq.matches(regex);
        if(flag){
            System.out.println(qq+"...is ok");
        }else{
            System.out.println(qq+"...不合法");
        }
    }


    //匹配手机号  13XXX 15XXX 18XXX
    public static void checkTel(){
        
        String tel="13966563456";
        String reg="[1][358]\\d{9}";
        System.out.println(tel.matches(reg));
    }
    
    //切割
    public static void splitDemo(){
        
        //去除其中的空格
        /*String str="zhangsan       lisi  wangwu";
        String reg=" +";//按多个空格进行切割
        String []arr=str.split(reg);
        
        for(String s:arr){
            System.out.println(s);
        }*/
        
        //取出c abc a.txt
        /*String dir="c:\\abc\\a.txt";
        String reg="\\\\";
        String [] arr=dir.split(reg);
        
        for(String s:arr){
            System.out.println(s);
        }*/
        
        //按照叠词完成切割
        /*String str="erkktyqquio";
        String reg="(.)\\1";  
        //引用第一组。为了可以让规则的结果被重用,可以将规则封装成一个组,用()完成。组的出现都有编号,从1开始。想使用已有的组,可通过\n(n是组的编号)的形式来获取
        
        String []arr=str.split(reg);
        for(String s:arr){
            System.out.println(s);
        }*/
        
        System.out.println("-------------");
        
        String str1="dfrrrrfdlieets";
        String reg1="(.)\\1+"; //第二个位置出现1次或多次
        
        String []arr1=str1.split(reg1);
        for(String s:arr1){
            System.out.println(s);
        }
        
    }

    //替换
    public static void replaceAllDemo(){
        
        //将字符串中的数字组替换成#
        String str="wer123ty34uiod234564fkjjd4324324f";
        
        String reg="\\d{5,}";
        
        String newStr="#";
        
        str=str.replaceAll(reg,newStr);
        
        System.out.println(str);
        
        //将叠词替换成&
        String str1="erkktyqqquizzzzzo";
        String reg1="(.)\\1+";
        String newStr1="&";
        
        str1=str1.replaceAll(reg1, newStr1);
        
        System.out.println(str1);
        
        //将叠词的字符换成单个字母  zzzz-->z
        String str2="erkktyqqquizzzzzo";
        String reg2="(.)\\1+";
        String newStr2="$1"; //拿前一个规则中的第一个组
        str2=str2.replaceAll(reg2, newStr2);
        System.out.println(str2);
    }

}

 

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

public class ZhengZe_02 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        getDemo();
    }

    public static void getDemo(){
        
        //将3个字母的拼音取出来
        String str="ming tian jiu yao fang jia le , da jia。";
        
        String reg="\\b[a-z]{3}\\b"; // \\b单词边界
        
        //将规则封装成对象
        Pattern p=Pattern.compile(reg);
        
        //让正则对象和要操作的字符串相关联,获取匹配器对象
        Matcher m=p.matcher(str);
        
        //将规则作用到字符串上,,并进行符合规则的子串查找
        /*boolean b=m.find();
        System.out.println(b);
        //用于获取匹配后的结果
        System.out.println(m.group()); */
        
        while(m.find()){
            System.out.println(m.group());
            System.out.println(m.start()+"..."+m.end()); //获取字符起始索引,[n1,n2)
        }
    }
}

 

需求:将字符串转为 我要学编程

到底用什么功能呢?
思考方式:
1.如果只想知道该字符串是对是错,可以使用匹配
2.想要将已有字符串变成另一个字符串,替换
3.想要按照指定的方式将字符串变成多个字符串,切割(获取规则以外的子串)
4.想要拿到符合需求的字符串子串,获取(获取符合规则的子串)

public class ZhengZe_03 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        test_1();
    }
    
    public static void test_1(){
        String str="我我...我我...我要...要要...要要要...学学学...学学...编编编...编程...程...程程...程...程";

        /*
        将已有字符串变成另一个字符串,使用  替换功能
        1.可以先将  . 去掉
        2.再将多个重复的内容变成单个内容
         */
        
        str=str.replaceAll("\\.+","");
        //System.out.println(str);
        
        str=str.replaceAll("(.)\\1+","$1");
        System.out.println(str);
        
    }

}

 

将ip地址进行地址段顺序的排序

还按照自然字符串自然排序,只要让它们每一段都是3位即可。
1.按照每一段需要的最多的0进行补齐,那么每一段都会至少保证有3位
1.将每一段只保留3位。这样,所有的ip地址都是每一段3位

public class ZhengZe_04 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        ipSort();
    }
    
    public static void ipSort(){
        
        String ip="192.68.1.254 102.49.23.013 10.10.10 2.2.2.2 9.109.90.30";
        
        //在获取的每一个前面加00
        ip=ip.replaceAll("(\\d+)","00$1"); 
        
        //将每一个变成三位数
        ip=ip.replaceAll("0+(\\d{3})", "$1");
        System.out.println(ip);    //如果不加0,10排在2前面
        
        String []arr=ip.split(" ");
        
        TreeSet<String> ts=new TreeSet();
        
        for(String s:arr){
            ts.add(s);
        }
        
        for(String s:ts){
            System.out.println(s.replaceAll("0+(\\d+)","$1"));
        }    
    }
}

 

 

对邮件地址进行校验

public class ZhengZe_05 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        checkMail();
    }

    public static void checkMail(){
        
        String mail="[email protected]";
        
        String reg="[a-zA-Z0-9_]{6,12}@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}"; //较为精确地匹配
        reg="\\[email protected]\\w+(\\.\\w+)+"; //非精确匹配
        
        System.out.println(mail.matches(reg));
    }
}

 

以上是关于39.正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

markdown 正则表达式模式片段

正则表达式匹配特定的 URL 片段而不是所有其他 URL 可能性

正则匹配开头为''结尾为','应该怎么写?

求php完整代码 使用正则表达式检索用户输入的查询关键字,并描红

循环通过 python 正则表达式匹配

asp.net 使用正则表达式验证包含打开/关闭括号片段的属性字符串