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

news2024/11/18 23:23:47

正则表达式基本练习

一、练习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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/112752.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SAP UI5 Smart Chart 功能介绍

笔者已经写过一篇详细的文章介绍 SAP UI5 Smart Chart 的使用方法: SAP UI5 应用开发教程之一百五十三 - 使用 SAP UI5 Smart Chart 控件轻松绘制十数种不同类型的专业图表 本文泛泛地介绍 Smart Chart 提供的一些其他功能。 工具栏右侧的按钮可用于选择图表类型…

Zookeeper 1 初识 Zookeeper 1.1 Zookeeper 概念

Zookeeper 【黑马程序员Zookeeper视频教程,快速入门zookeeper技术】 文章目录Zookeeper1 初识 Zookeeper1.1 Zookeeper 概念1.1.1 Zookeeper 概念1 初识 Zookeeper 1.1 Zookeeper 概念 1.1.1 Zookeeper 概念 Zookeeper 是 Apache Hadoop 项目下的一个子项目&…

3、前端笔记-JS-变量

1、什么是变量 变量是用于存放数据的容器,可以通过变量名获取数据 本质:变量是程序在内存中申请的一块用来存放数据的空间 2、变量的使用 2.1 声明变量和赋值 1、声明变量 2、给变量赋值 var:JS关键字,用来声明变量。使用这个关键字后&a…

(二)计算机组成原理——计算机的基本组成

目录 冯诺依曼计算机的特点 计算机硬件框图 系统复杂性管理的方法(3’Y) 计算机的工作步骤 上机前的准备 计算机的工作过程 存储器的基本组成 运算器的基本组成及操作过程 控制器 计算机组成原理课程笔记。 冯诺依曼计算机的特点 冯诺依曼计算…

sandbox启动未加载repeater的问题

背景 通过官方提供的 repeater 的下载链接,并不能够在sandbox启动时,加载进行,我们可以看下sandbox的日志截图 但是如果通过源码的repeater进行安装后,就能够成功加载到repeater。 分析 这是个很奇怪的问题,想要分析…

Sentinel的规则

四.Sentinel的规则 1.流控规则 1.1流控规则有哪些? 流量控制有以下几个角度: 资源的调用关系,例如资源的调用链路,资源和资源之间的关系;运行指标,例如 QPS(每秒查询率)、线程池、系统负载等&#xff…

深度学习时数据量过大的一个解决思路:将零散的数据集中化

问题描述 最近笔者在做一个kaggle上的树叶分类的题目(https://www.kaggle.com/competitions/classify-leaves),这个题目要求根据一张树叶的图片给出这片树叶的类别,这个题目也是沐神的《动手深度学习》课程里的一个课程竞赛题目。…

编译原理笔记03

第四章 语义分析 语义分析也称为类型检查,上下文相关分析,主要负责检查程序的上下文相关的属性,例如变量使用前要声明,函数调用要与声明一致等。 1.语义规则 通常来说,程序设计语言都采用自然语言来表达程序语言的语义…

JMeter分布式压测

一、Jmeter4.0分布式压测准备工作 压测注意事项 the firewalls on the systems are turned off or correct ports are opened. 系统上的防火墙被关闭或正确的端口被打开。 all the clients are on the same subnet. 所有的客户端都在同一…

数据科学与工程理论基础复习提纲

一、Sketch 1.1 简单抽样算法 1.1.1 核心思想 对于到达的元素aia_iai​,以概率pM/mpM/mpM/m对该元素的频数加1。 MMM:抽样后的数据流大小mmm:原始数据流大小 1.1.2 操作 更新:当元素aia_iai​到达时,以ppp的概率更…

分库分表:垂直分库、垂直分表、水平分库、水平分表四个概念

文章目录一、分库分表的意义二、垂直分表的思路三、垂直分库的思路四、水平分库的思路五、水平分表的思路一、分库分表的意义 随着公司业务快速发展,数据库中的数据量猛增,访问性能也变慢了,优化迫在眉睫。分析一下问题出现在哪儿呢&#xf…

太强了,阿里内部JDK源码剖析知识手册,由浅入深堪称完美

前言 作为Java程序员,在这里想问问大家在空余时间有没有去读过 JDK 源码,虽然读源码有点自不量力的感觉,(大佬可以忽略这句)但是如若能够经常在空余时间看一下 jdk 源码不仅可以让自己对日常的开发环境了解得更加深刻…

【nowcoder】笔试强训Day3

目录 一、选择题 二、编程题 2.1在字符串中找出连续最长的数字串 2.2 数组中出现次数超过一半的数字 一、选择题 1.以下代码运行输出的是 public class Person{private String name "Person";int age0;} public class Child extends Person{public String gra…

Python json常见用法

目录 导包 api介绍 常见用法 json转python内置对象 字典对象 数组对象 文件读取 python内置对象转json 字典转json 字典转json(压缩存储) 字典转json(美化输出) 文件读取 自定义对象 普通对象 嵌套对象 补充支持 …

设计一个亿级高并发系统架构 - 12306火车票核心场景DDD领域建模

“ 架设一个亿级高并发系统,是多数程序员、架构师的工作目标。 许多的技术从业人员甚至有时会降薪去寻找这样的机会。但并不是所有人都有机会主导,甚至参与这样一个系统。今天我们用12306火车票购票这样一个业务场景来做DDD领域建模。” 开篇 要实现软件…

数据库系统概论第七章(数据库设计)知识点总结(1)—— 概述

本专栏收录了数据库的知识点,而从本文起,将讲述有关于数据库设计有关知识点,提供给有需要的小伙伴进行学习,本专栏地址可以戳下面链接查看 🎈 数据库知识点总结(持续更新中):【数据库…

了解学习node中著名的co模块原理,生成器+promise实现async+await

***内容预警*** 新手内容,菜鸟必看,大佬请绕道 首先 co 是一个npm第三方模块,我们需要npm install 之后才能使用它。 作为一个菜鸟我相信你肯定没有用过这个模块,但是据说这个模块很有名,那么我们就有必要来了解一下它…

35. 池化层 / 汇聚层 代码实现

1. 池化层 在下面的代码中的pool2d函数,我们实现汇聚层的前向传播。 这类似于之前文章中的的corr2d函数。 然而,这里我们没有卷积核,输出为输入中每个区域的最大值或平均值。 from torch import nn from d2l import torch as d2l# X是输入&…

实习------Java基础

基础语法 基本数据类型(熟悉) Java有哪些数据类型 定义:Java语言是强类型语言,对于每一种数据都定义了明确的具体的数据类型,在内存中分配了不同大小的内存空间。 boolean类型占多少个字节? boolean类型…

【docker】手把手教学docker与docker-compose安装

目录 1、docker安装 2、docker-compose安装 1、docker安装 方式一 https://fanjufei.blog.csdn.net/article/details/123500511https://fanjufei.blog.csdn.net/article/details/123500511 方式二 通过命令行安装。 sudo apt install docker.io sudo systemctl status doc…