Java正则表达式

一、正则表达式的体验

        正则表达式

                概念:其实就是一个匹配的原则,用来替换之前复杂的if判断结构

                                在Java中,我们经常需要验证一些字符串,是否符合既定规则

                PS:

                        我们要验证QQ号或者手机号,以及邮箱是否正确,我们就需要使用if来判断
                        这个时候我们为了优化代码,就需要使用正则表达式,来验证各种字符串的规则,它内部定义了一些规则,来验证我们的字符串是否符合规则

        需求:

                使用程序让用户输入QQ号码,要求QQ号码
                  1.必须是5-15位的长度
                  2.必须全部都是数字
                  3.首位不能是0

    public static void main (String[] args) {

        System.out.println(checkQQ_1("123456789"));
        System.out.println(checkQQ_2("123456789"));
        
    }


    // 使用正则表达式验证QQ
    public static boolean checkQQ_2(String qq){
        return qq.matches("[1-9]\\d{4,14}");
    }


    // 验证QQ号码格式是否正确
    public static boolean checkQQ_1(String qq){
        // 第一,不能为空
        if(qq == null){
            return false;
        }
        // 第二,长度必须为5-15位
        if(qq.length() < 5 || qq.length() > 15){
            return false;
        }
        // 第三,必须全部是数字
        for(int i = 0; i < qq.length(); i++){
            // 获取qq中的每一个字符
            char c = qq.charAt(i);
            // 判断字符是否非数字
            if(c < '0' || c > '9'){
                return false;
            }
        }
        // 第四,首位不能位0
        if(qq.charAt(0) == '0'){
            return false;
        }
        return true;
    }

        输出结果:
            true
            true

二、正则表达式的基本使用

        (一)、字符类

                语法实例:[]表示匹配单个字符 ^取反 -范围
                    1.[abc]:代表a或者b,或者c字符的一个
                    2.[^abc]:代表abc以外的任意字符
                    3.[a-z]:代表a到z的所有小写字符中的任意一个,左右包含
                    4.[A-Z]:代表A到Z的所有大写字符中的任意一个,左右包含
                    5.[0-9]:代表0-9的所有数字中的任意一个,左右包含
                    6.[a-zA-Z0-9]:代表a到z,A到Z,0到9之间的任意一个字符,
                    7.[a-dm-p]:代表a到d,m到p之间的任意一个字符

        String str = "ead";
        // 验证str是否以h开头,以d结尾,中间是否是a,e,i,o,u中的某个字符
        System.out.println(str.matches("h[aeiou]d"));
        System.out.println("hbd".matches("h[aeiou]d"));
        System.out.println("head".matches("h[aeiou]d"));
        System.out.println("hhd".matches("h[aeiou]d"));

        // 验证str是否是 a-z 的任何一个小写字符开头,后面跟的是ab
        System.out.println("accb".matches("[a-z][^c-z]"));
        // 验证str是否以 a-d 或者 m-p之间某个字符开头,后面跟的是ab
        System.out.println("e".matches("[a-dm-p]"));

            输出结果:
                false
                true
                false
                false
                false
                false

        (二)、逻辑运算符类

                语法:
                    1.  &&  且
                    2.  |  或者

        tring str = "abc";
        // 要求字符串是小写字符开头,后面跟ad,除了aeiou之外,其他都是小写字母
        System.out.println(str.matches("[a-z&&[^aeiou]]ad"));

        // 要求字符串是aeiou中的某个字符开头,后面跟ad
        System.out.println(str.matches("[a|e|i|o|u]ad"));

            输出结果:        
                false
                false

        (三)、预定义字符

                   语法:

                        - "."   匹配任何字符,如果你要使用 . 的话,需要加上转义   \.
                        - "\d"  匹配任何数字[0-9]
                        - ”\D"  匹配非数字[^0-9]
                        - "\s"  空白字符[\n\t\r\f\x0B]
                        - "\S"  非空白字符[^\n\t\r\f\x0B]
                        - "\w"  单词字符[a-zA-Z]_0-9]
                        - "\W"  非单词字符[a-zA-Z]_0-9]

    public static void main (String[] args) {
        String str = "258";
        // 验证str是否是三位数字
        System.out.println(str.matches("\\d\\d\\d"));
        // 验证手机号码:  1开头,3/5/8是第二位,剩下的九位是0-9的数字
        System.out.println("123456789".matches("1[358]\\d\\d\\d\\d\\d\\d\\d\\d\\d"));
        System.out.println("1324567890".matches("1[358]\\d\\d\\d\\d\\d\\d\\d\\d\\d"));
        System.out.println("13245678".matches("1[358]\\d\\d\\d\\d\\d\\d\\d\\d\\d"));

        // 验证字符串是否以 h开头,以d结尾,中间是任何字符
        System.out.println("h.d".matches("h.d"));
        System.out.println("h d".matches("h.d"));
        System.out.println("h& d".matches("h.d"));

        // 验证只能匹配 h.d
        System.out.println("h.d".matches("h\\.d"));
    }

        输出结果:
            true
            false
            false
            false
            true
            true
            false
            true

        (四)、分组括号

                        分组括号()

                        \\1表示的意思是按照之前的再来一个

        String str = "EDSW-ES9F-KHJG-87JHG-OHV7";
        // 分为5组,前面4组规则一样,后面一组单独规则
        System.out.println(str.matches("([A-Z0-9]{4}-){4}[A-Z0-9]{4}"));

        // 哈哈,嘿嘿,哼哼,呵呵的词的正则
        System.out.println("哈哈".matches("(.)\\1"));
        System.out.println("嘿哈".matches("(.)\\1"));

        // 哈哈嘿嘿
        System.out.println("哈哈嘿嘿".matches("(.)\\1(.)\\2"));

            输出结果:
                
            false
            true
            false
            true

        (五)、数量词

                        语法:

                                X?      0次或1次
                                X*      0次或多次
                                X+      1次或多次
                                X{n}    恰好n次
                                X{n,}   至少n次
                                X{n,m}  n次到m次,n和m包含

        // 验证str是否是三位数字
        System.out.println("".matches("\\d{3}"));
        System.out.println("123".matches("\\d{3}"));
        System.out.println("1234".matches("\\d{3}"));

        // 验证str是否至少1位
        System.out.println("".matches("\\d{2,}"));
        System.out.println("1".matches("\\d+"));
        System.out.println("12".matches("\\d+"));

        // 验证手机号码:1开头,3/5/8是第二位,剩下九位是0-9的数字
        System.out.println("".matches("1[358]\\d{9}"));

        // qq号码,1 必须是5-15位, 2、都是数字      3、首位不是0
        System.out.println("12345123451234".matches("[0-9]\\d{4,14}"));

            输出结果:
                false
                true
                false
                false
                true
                true
                false
                true

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值