18-JavaSE基础巩固练习:正则表达式练习

正则表达式基本练习

一、练习1

1、需求
  • 请编写正则表达式验证用户输入的手机号码是否满足要求。
  • 请编写正则表达式验证用户输入的邮箱号是否满足要求。
  • 请编写正则表达式验证用户输入的电话号码是否满足要求。

2、思路:
  • 心得

  • 拿着一个正确的数据,从左到右依次去写正则表达式。

  • 手机号码正则表达

    手机号:13112345678	15712345678 18812345678 139456789024
    
    • 分成三个部分:
      • 第一部分:第一位只能是1开头
      • 第二部分:第二位是3-9
      • 第三部分:第二位之后的是0-9(任意数字)
  • 电话号码(座机)正则表达

    电话号码(座机):020-2324242 02122442 027-42424 0712-3242434
    
    • 分成三部分:
      • 第一部分:第一位是区号(0)
      • 第二部分:第二位是 “-”,出现的次数是1次或0次
      • 第三部分:号码(总长度5-10)
        • 号码的第一位只能是1-9开头
        • 第一位之后的是0-9(任意数字)
  • 邮箱号码正则表达

    邮箱号:3232323@qq.com zhangsan@itcast.cnn d_lei0009@163.com dlei0009@pci.com.cn
    
    • 分成三个部分:
      • 第一部分:@的左边
        • 可以是数字、大小写字母、下划线
        • 至少要出现一次
      • 第二部分:@
        • 只能出现一次
      • 第三部分:
        • (1)“.” 的左边:可以是数字、大小写字母(除了下划线),总共出现2-6次
        • (2)“.”
        • (3)"."的右边:可以是大小写字母,只能出现2-3次


3、实现
package com.app.demo27_regex;

public class Test1 {
    public static void main(String[] args) {
        /*
            正则表达式的基本练习1:
                一、需求:
                    请编写正则表达式验证用户输入的手机号码是否满足要求。
                    请编写正则表达式验证用户输入的电话号码是否满足要求。
                    请编写正则表达式验证用户输入的邮箱号是否满足要求。
                二、心得:
                    拿着一个正确的数据,从左到右依次去写正则表达式。
         */
        /*
            例如:
                手机号:13112345678    15712345678 18812345678 139456789024
                电话号码(座机):020-2324242 02122442 027-42424 0712-3242434
                邮箱号:3232323@qq.com zhangsan@itcast.cnn d_lei0009@163.com dlei0009@pci.com.cn
         */

        /*
            1、手机号码正则表达
            手机号:13112345678    15712345678 18812345678 139456789024
            思路:
                分成三个部分:
                    第一部分:第一位只能是1开头
                    第二部分:第二位是3-9
                    第三部分:第二位之后的是0-9(任意数字)
         */
        /*正则表达式分析:
               [1]: 表示手机号码的第一位只能是1开头
               [3-9]: 表示手机号码的第二位只能是3-9
               \\d{9}: 表示手机号码第二位之后的都是任意数字(0-9),只能出现9次
         */
        String phoneRegex1 = "[1][3-9]\\d{9}";
        // String类的matches()方法: 判断该字符串是否与给定的正则表达式匹配
        System.out.println("13112345678".matches(phoneRegex1));
        System.out.println("15712345678".matches(phoneRegex1));
        System.out.println("18812345678".matches(phoneRegex1));
        System.out.println("139456789024".matches(phoneRegex1));


        System.out.println("---------------------------");

        /*
            2、电话号码(座机)正则表达
            电话号码(座机):020-2324242 02122442 027-42424 0712-3242434
            思路:
                分成三部分:
                    第一部分:第一位是区号(0),第二位开始是任意数字(0-9,可以出现2-3次)
                    第二部分:第四位是 “-”,出现的次数是1次或0次
                    第三部分:号码(总长度5-10)
                      号码的第一位只能是1-9开头
                      第一位之后的是0-9(任意数字)
         */
        /*
            正则表达式分析:
                 [0]: 表示区号只能是数字0
                 \\d{2,3}: 表示区号之后可以是任意数字,只能出现2-3次
                 -?: 表示这个杠出现的次数是1次或0次(可有可无)
                 [1-9]: 表示号码的第一位只能是1-9开头
                 \\d{4,9}: 表示号码第一位之后的可以是任意数字(0-9),只能出现4-9次
         */
        String phoneRegex2 = "[0]\\d{2,3}-?[1-9]\\d{4,9}";
        System.out.println("020-2324242".matches(phoneRegex2));
        System.out.println("02122442".matches(phoneRegex2));
        System.out.println("027-42424".matches(phoneRegex2));
        System.out.println("0712-3242434".matches(phoneRegex2));


        System.out.println("---------------------------");

        /*
            3、邮箱号码正则表达
            邮箱号:3232323@qq.com zhangsan@itcast.cnn d_lei0009@163.com dlei0009@pci.com.cn
            思路:
                分成三个部分:
                    第一部分:@的左边
                       可以是数字、大小写字母、下划线
                       至少要出现一次
                    第二部分:@
                       只能出现一次
                    第三部分:
                      (1)"." 的左边:可以是数字、大小写字母(除了下划线),总共出现2-6次
                      (2)"."
                      (3)"."的右边:可以是大小写字母,只能出现2-3次
                      (4)我们可以把(2)


         */
        /*
            正则表达式分析:
                \\w+: 表示@左边可以是数字、大小写字母、下划线,至少出现1次
                @: 表示@,只能出现1次
                [\\w&&[^_]]{2,6}: 表示 . 的左边,可以是数字、字母(除了下划线),总共出现2-6次
                (\\.[a-zA-Z]{2,3}){1,2}: 表示将 . 与 .右边的字母作为一组,可以出现1-2次
                    \\.: 表示 .
                    [a-zA-Z]{2,3}: 表示 . 的右边,只能是大小写字母,只能出现2-3次
         */
        String mailRegex = "\\w+@[\\w&&[^_]]{2,6}(\\.[a-zA-Z]{2,3}){1,2}";
        System.out.println("3232323@qq.com".matches(mailRegex));
        System.out.println("zhangsan@itcast.cnn".matches(mailRegex));
        System.out.println("d_lei0009@163.com".matches(mailRegex));
        System.out.println("dlei0009@pci.com.cn".matches(mailRegex));
    }
}
true
true
true
false
---------------------------
true
true
true
true
---------------------------
true
true
true
true

Process finished with exit code 0




二、IDEA拓展知识

1、安装插件:any-rule

在这里插入图片描述

在这里插入图片描述



2、快捷编写正则表达式

在这里插入图片描述


在这里插入图片描述





三、练习2

1、需求
  • 请编写正则表达式验证用户名是否满足要求:
    • 要求:大小写字母、数字、下划线,长度4-16位
  • 请编写正则表达式验证身份证号码是否满足要求:
    • 简单要求:18位,前17位为任意数字,最后一位可以是任意数字也可以是大写或小写的x
    • 复杂要求:按照身份证号码的格式严格要求。

2、思路
  • 1、正则表达式验证用户名:
    • 大小写字母、数字、下划线:\ \w
    • 长度4-16位:\ \w{4,16}
  • 2、正则表达式验证身份证号码:
    • 简单:
      • 前17位为任意数字:\ \d{17}
      • 最后一位可以是任意数字也可以是大写X或小写x:[\ \dXx]、(\ \d|X|x)、(\ \d|(?i)x)
    • 复杂:
      • 前6位:省份、市区、派出所等信息,第一位不能为0,后面5位是任意数字:[1-9]\ \d{5}
      • 年的前2位:18 19 20:(18|19|20)
      • 年的后2位:任意数字出现两次:\ \d{2}
      • 月份:01~09、10、11、12:(0[1-9]|1[0-2])
      • 日期:0109、1019、20~29、30、31:(0[1-9]|12[0-9]|3[01])
      • 后面四位:
        • 前三位:任意数字出现3次:\ \d{3}
        • 最后一位:可以是任意数字也可以是大写X或小写x:(\ \d|(?i)x)

3、实现
package com.app.demo27_regex;

import java.util.Scanner;

public class Test2 {
    public static void main(String[] args) {
        /*
            正则表达式的基本练习2:
                - 请编写正则表达式验证用户名是否满足要求:
                  - 要求:大小写字母、数字、下划线,长度4-16位
                - 请编写正则表达式验证身份证号码是否满足要求:
                  - 简单要求:18位,前17位为任意数字,最后一位可以是任意数字也可以是大写或小写的x
                  - 复杂要求:按照身份证号码的格式严格要求。

             正确的身份证号码:
               41080119930228457x、510801197609022309、15040119810705387X、430102197606046442
         */

        // 创建键盘录入对象
        Scanner sc = new Scanner(System.in);
        checkUsername(sc);  // 正则校验用户名
        checkID1(sc);       // 简单正则校验身份证
        checkID2(sc);       // 复杂正则校验身份证
    }

    /**
     * 正则校验用户名
     * @param sc    键盘录入对象
     */
    private static void checkUsername(Scanner sc) {
        /*
            - 1、正则表达式验证用户名:
              - 大小写字母、数字、下划线:\\w
              - 长度4-16位:\\w{4,16}
        */
        String nameRegex = "\\w{4,16}";
        System.out.println("------正则校验用户名-------");
        System.out.println("请输入您的用户名:");
        String username = sc.next();
        if (username.matches(nameRegex)) {
            System.out.println("用户名校验成功!");
        }else {
            System.out.println("用户名校验失败!");
        }
    }

    /**
     * 正则简单校验身份证号码
     * @param sc    键盘录入对象
     */
    private static void checkID1(Scanner sc) {
        /*
            - 2、正则表达式验证身份证号码:
              - 简单:
                - 前17位为任意数字:\\d{17}
                - 最后一位可以是任意数字也可以是大写X或小写x:[\\dXx]、(\\d|X|x)、(\\d|(?i)x)
         */
        // 简单正则
        String IDRegex1 = "\\d{17}[\\dXx]";
        System.out.println("------简单正则校验身份证号码-------");
        System.out.println("请输入您的身份证号码:");
        String ID = sc.next();
        if (ID.matches(IDRegex1)) {
            System.out.println("身份证简单校验成功!");
        }else {
            System.out.println("身份证简单校验失败!");
        }
    }

    /**
     * 正则复杂校验身份证号码
     * @param sc    键盘录入对象
     */
    private static void checkID2(Scanner sc) {
        /*
            - 复杂:
                - 前6位:省份、市区、派出所等信息,第一位不能为0,后面5位是任意数字:[1-9]\\d{5}
                - 年的前2位:18 19 20:(18|19|20)
                - 年的后2位:任意数字出现两次:\\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[0-9]|3[01])
                - 后面四位:
                  - 前三位:任意数字出现3次:\\d{3}
                  - 最后一位:可以是任意数字也可以是大写X或小写x:(\\d|(?i)x)
         */
        // 复杂正则
        String IDRegex2 = "[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|12[0-9]|3[01])\\d{3}(\\d|(?i)x)";
        System.out.println("请输入您的身份证号码:");
        String ID2 = sc.next();
        if (ID2.matches(IDRegex2)) {
            System.out.println("身份证复杂校验成功!");
        }else {
            System.out.println("身份证复杂校验失败!");
        }
    }
}
------正则校验用户名-------
请输入您的用户名:
Hu_2022Abc
用户名校验成功!
------简单正则校验身份证号码-------
请输入您的身份证号码:
41080119930228457x
身份证简单校验成功!
请输入您的身份证号码:
510801217600321156
身份证复杂校验失败!

Process finished with exit code 0




四、正则表达式小结

符号含义举例
[]里面的内容出现一次[0-9]、[a-zA-Z0-9]
()分组a(bc)+
^取反[^abc]
&&交集,不能写单个的&[a-z&&m-p]
|写在方括号外面表示并集[a-zA-Z0-9]、x|X
.任意字符\n:回车符号不匹配
\转义字符\ \d
\ \d0-9\ \d+
\ \D非0-9\ \D+
\ \s空白字符[\t\n\x0B\f\r]
\ \S非空白字符[^\s]
\ \w单词字符[a-zA-Z_0-9]
\ \W非单词字符[^\w]
?0次或1次\ \d?
*0次或多次\ \d*、(abc) *
+1次或多次\ \d+、(abc)+
{}具体次数a{7}、\ \d{7,19}
(?i)忽略后面字符的大小写(?i)abc
a((?i)b)c只忽略b的大小写a((?i)b)c
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值