Java-初识正则表达式 以及 练习

目录

什么是正则表达式?

1. 正则表达式---字符类(一个大括号匹配一个字符):

2. 正则表达式---预字符类(也是匹配一个字符):

正则表达式---数量词 (可以匹配多个字符):

正则表达式的练习 1:

习题一:

习题二:

习题三:

正则表达式的练习 2:

习题一:

习题二:

正则表达式 小结:


什么是正则表达式?


正则表达式的作用?

  • 在一段文中查找满足要求的内容(后面介绍)
  • 可以校验字符串是否满足一定的规则,并用来校验数据格式的的合法性。是一种校验字符串的规则如:

如可用来:校验用户名是否满足规则、校验密码是否满足规则、校验身份证是否满足规则、校验手机号 是否满足规则。等等

由一个例题引出正则表达式:

如:例题:

验证 QQ 号:

  • QQ号码必须是 6--20 位长度
  • 而且必须全部是数字
  • 而且首位不能为0

按照以前的方法我们是这样的写的:

public class RegexDemo {
    public static void main(String[] args) {
        String qq = "2233445566";
        boolean check = check(qq);
        System.out.println(check);
    }
    //校验的方法
    public static boolean check(String qq) {
        int len = qq.length();
    if (len >= 6 && len <= 20) {
        if (!qq.startsWith("0")) {
            for (int i = 0; i < qq.length(); i++) {
                if (!(qq.charAt(i) >= '0' && qq.charAt(i) <= '9')) {
                    return false;
                }
            }
            return true;
        }
    }
    return false;
    }
}

上面的核心思想:

通过不断嵌套满足题目条件,

或也可以先把异常数据进行过滤,最后就是满足条件的数据,return true

明显代码很繁琐,这时我们就可以使用正则表达式来简化代码

String qq = "2233445566";
System.out.println(qq.matches("[1-9]\\d{5,19}"));
// [1-9] 表示必须以1-9的数字开头
//  \\d{5,19}表示任意数字至少出现5次,至多出现19次


APi 查找规则位置:


1. 正则表达式---字符类一个大括号匹配一个字符):

解释:

  • 第 3 和 4 其实是一样的,
  • [ad-z]:表示:a 或 d 到 z

  • 代码理解:
//只能是a b c其中之一
System.out.println("-----------1-------------");
System.out.println("a".matches("[abc]")); // true
System.out.println("z".matches("[abc]")); // false

//不能出现a b c
System.out.println("-----------2-------------");
System.out.println("a".matches("[^abc]")); // false
System.out.println("z".matches("[^abc]")); // true
System.out.println("zz".matches("[^abc]")); //false
System.out.println("zz".matches("[^abc][^abc]")); //true


// a到z或A到Z(包括头尾的范围)
System.out.println("-----------3-------------");
System.out.println("a".matches("[a-zA-Z]")); // true
System.out.println("z".matches("[a-zA-Z]")); // true
System.out.println("aa".matches("[a-zA-Z]"));//false
System.out.println("zz".matches("[a-zA-Z]")); //false
System.out.println("zz".matches("[a-zA-Z][a-zA-Z]")); //true
System.out.println("0".matches("[a-zA-Z]"));//false
System.out.println("0".matches("[a-zA-Z0-9]"));//true

// [a-d[m-p]] a到d,或m到p   和上面一个意思
System.out.println("-----------4-------------");
System.out.println("a".matches("[a-d[m-p]]"));//true
System.out.println("d".matches("[a-d[m-p]]")); //true
System.out.println("m".matches("[a-d[m-p]]")); //true
System.out.println("p".matches("[a-d[m-p]]")); //true
System.out.println("e".matches("[a-d[m-p]]")); //false
System.out.println("0".matches("[a-d[m-p]]")); //false

// [a-z&&[def]] a-z和def的交集。为:d,e,f
System.out.println("----------5------------");
System.out.println("a".matches("[a-z&[def]]")); //false
System.out.println("d".matches("[a-z&&[def]]")); //true
System.out.println("0".matches("[a-z&&[def]]")); //false

// [a-z&&[^bc]] a-z和非bc的交集。(等同于[ad-z])
System.out.println("-----------6------------_");
System.out.println("a".matches("[a-z&&[^bc]]"));//true
System.out.println("b".matches("[a-z&&[^bc]]")); //false
System.out.println("0".matches("[a-z&&[^bc]]")); //false

// [a-z&&[^m-p]] a到z和除了m到p的交集。(等同于[a-1q-z])
System.out.println("-----------7-------------");
System.out.println("a".matches("[a-z&&[^m-p]]")); //true
System.out.println("m".matches("[a-z&&[^m-p]]")); //false
System.out.println("0".matches("[a-z&&[^m-p]]")); //false

注意 5 中的第一个:

&不能单独使用,

会被当成字符


2. 正则表达式---预字符类也是匹配一个字符):


在介绍与预字符类前介绍一下转义字符

\ 可改变后面那个字符原本的含义:

  • 如:

双引号在 java 中表示字符串的开头和结尾

若要打印一个双引号就要使用 \ 来将双引号转义成一个普通的双引号(不含任何含义)

  • 如:

要打印一个 \(不含任何含义),可在它前再加一个 \ 进行转义,如 \\

总之记住两个 \\ 代表一个 \

....

转义字符以后再谈

System.out.println(""")// 报错
System.out.println("\"");// "
System.out.println("\\");// \

回过 头来:

注意

  • 区分大小写
  • 书写时要写 \\

  • 代码理解:
//.表示任意一个字符
System.out.println("你".matches("..")); //false
System.out.println("你".matches(".")); //true
System.out.println("你a".matches(".."));//true


// \\d 表示任意的一个数字(只能是一位)
// 简单来记:两个\表示一个\
System.out.println("a".matches("\\d")); // false
System.out.println("3".matches("\\d")); // true
System.out.println("333".matches("\\d")); // false



//\\w只能是一位单词字符[a-zA-Z_0-9]
System.out.println("z".matches("\\w")); // true
System.out.println("2".matches("\\w")); // true
System.out.println("21".matches("\\w")); // false
System.out.println("你".matches("\\w"));//false
System.out.println("A9".matches("\\w\\w"));//true

// 非单词字符
System.out.println("你".matches("\\W")); // true
System.out.println("---------------------------------------------");


注意以上的正则匹配只能校验单个字符

3.正则表达式---数量词 (可以匹配多个字符):

注意要和前面的 X 配套使用

代码理解:

// 必须是数字 字母 下划线 至少 6位
System.out.println("4Aa0_A".matches("\\w{6,}"));//true
System.out.println("4Aa".matches("\\w{6,}"));//false

 必须是数字和字符 必须是4位
System.out.println("23dF".matches("[a-zA-Z0-9]{4}"));//true
System.out.println("23_F".matches("[a-zA-Z0-9]{4}"));//false
System.out.println("23dF".matches("[\\w&&[^_]]{4}"));//true
System.out.println("23_F".matches("[\\w&&[^_]]{4}"));//false


正则表达式的练习 1

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


技巧先拿着正确数据,将数据分成不同部分,

从左到右依次写规则


习题一:

  • 正确手机号码

13112345678

13712345667

13945679027

139456790271

手机号要求:

  • 1 开头
  • 第二个数是: 3-9
  • 一共 11 位

示例:


String regex="[1][3-9]\\w{9}";
System.out.println("15327998608".matches(regex));//true
System.out.println("12179986090".matches(regex));//false
System.out.println("11179986090".matches(regex));//false
System.out.println("151799860909".matches(regex));//false
System.out.println("05179986090".matches(regex));//false

习题二:

  • 正确座机电话号码

020-2324242

02122442

027-42424

0712-3242434

座机号码要求:

  • 第一部分:区号
  • 以 0 开头:
  • 3 或 4 位:
  • 0\\d{2,3}
  • 第二部分:-
  • - ? (表示-可出现 0 次或 1 次)
  • 第三部分:号码
  • 不能以 0 开头
  • 号码长度 5-10 位
  • [1-9]\\d{4-9}

表达式如下:

String regex2="0\\d{2,3}-?[1-9]\\d{4-9}"
....


习题三:

  • 正确邮箱号码

3232_323@qq.com

zhan_gsan@itcast.cnn

dlei0009@163.com

dlei0009@pci.com.cn

邮箱地址要求:

  • 第一部分:@的左边
    • \\w+ (表示任意字母数字下划线,至少出现一次)
  • 第二部分:@
    • @ (表示只能出现一次)
  • 第三部分:
    • . 的左边 :[ \\w&&[^_] ] {2,6} (任意的字母加数字,总共出现2-6次(此时不能出现下划线)
    • . 和 右边:(\\.[a-z A-Z]{2-3}){1,2} (一个. 还有 大写字母,小写字母都可以,只能出现2-3次) 可出现 1 次或 2 次
String regex3="\\w+@[\\w&&[^_]]{2,6}(\\.[a-zA-Z]{2-3}){1,2}"
....

注意这里的 ”点“的表示是

\\.


正则表达式的练习 2

习题一:

用户名要求:

  • 大小写字母、数字、下划线一共 4-16 位
String regex="\\w{4,16}";
...

习题二:

身份证 简单要求:

  • 18 位
  • 不以 0 开头
  • 前 17 任意数
  • 最后一位可以是数字、X、x
String regex1="[1-9]\\d{16}(\\d|X|x)";//1
String regex2="[1-9]\\d{16}[\\dx]";//2
...

先学一招:

忽略大小写的书写方式:

String regex1="(?i)abc"//忽略abc大小写
System.out.println("ABc".matches(regex1));//true

String regex2="a(?i)bc"//忽略bc大小写
System.out.println("ABc".matches(regex1));//false

这时我们就可以改写上面的身份证检验练习:

String regex1="[1-9]\\d{16}(\\d|(?i)x)";

小细节:

若(?i) 被当作工具了

i 的字体会改变


身份证的严格校验:

  • 前六位:省份,市区,派出所等信息
  • 第一位不能是 0
  • 后五位任意

[1-9]\\d{5}

  • 年份的前半段:18、19、20
  • 年的后半段:任意数字出现两次

(18|19|20)\\d{2}

  • 月份:01-09、或 10、11、12

(0[1-9] | 1[0-2])

  • 日:01-09、10-19、21-29 、30、31

( 0[1-9] | [12] \\d | 3[01] )

  • 后四位:前三位任意、最后一位可以是数字、X、x

\\d{3} [\\dXx]

最后拼接起来即可

正则表达式 小结:


正则表达式重要的是看得懂

AnyRule 插件


本章介绍了正则表达式,以及规则、校验字符串是否满足规则的重要作用。

下篇介绍第二个重要作用:在一段文本中查找满足要求的内容

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS-$$语法:内置组件双向同步

$$语法&#xff1a;内置组件双向同步 $$运算符为系统内置组件提供TS变量的引用&#xff0c;使得TS变量和系统内置组件的内部状态保持同步。 内部状态具体指什么取决于组件。例如&#xff0c;Refresh组件的refreshing参数。 使用规则 当前$$支持基础类型变量&#xff0c;以及…

版权申请介绍

因工作需要&#xff0c;做的APP里面涉及卡通人物形象涉及版权问题&#xff0c;这里记录下涉及版权相关知识。 软件本身申请软著&#xff0c;软著即软件著作权&#xff0c;是指软件的开发者或者其他权利人依据有关著作权法律的规定&#xff0c;对于软件作品所享有的发表权、开发…

C++进阶(五)二叉搜索树

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、二叉搜索树概念二、二叉搜索树操作三、二叉搜索树的实现四、二叉搜索树的应用五、二叉搜索…

C++中特殊类的设计与单例模式的简易实现

设计一个只能在堆上创建对象的类 对于这种特殊类的设计我们一般都是优先考虑私有构造函数。然后对于一些特殊要求就直接通过静态成员函数的实现来完成。 class A//构造函数私有&#xff08;也可以析构函数私有&#xff09; { public:static A* creat(){return new A;} privat…

VsCode + CMake构建项目 C/C++连接Mysql数据库 | 数据库增删改查C++封装 | 信息管理系统通用代码 ---- 课程笔记

这个是B站Up主&#xff1a;程序员程子青的视频 C封装Mysql增删改查操作_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1m24y1a79o/?p6&spm_id_frompageDriver&vd_sourcea934d7fc6f47698a29dac90a922ba5a3安装mysql:mysql 下载和安装和修改MYSQL8.0 数据库存储…

2023 年,我患上了 AI 焦虑症!

【作者有话说】2023 年对我来说是神奇的一年&#xff0c;我意外地从一个程序员变成了一个 AI 资讯届的“网红”&#xff0c;到年底时我在 X 平台的阅读量超过 1 亿&#xff0c;微博上的阅读量则超过 10 亿&#xff0c;很多人通过我的微博或者 X 了解最新的 AI 资讯、教程和 Pro…

C#,字符串匹配(模式搜索)Sunday算法的源代码

Sunday算法是Daniel M.Sunday于1990年提出的一种字符串模式匹配算法。 核心思想&#xff1a;在匹配过程中&#xff0c;模式串并不被要求一定要按从左向右进行比较还是从右向左进行比较&#xff0c;它在发现不匹配时&#xff0c;算法能跳过尽可能多的字符以进行下一步的匹配&…

多维时序 | Matlab实现CNN-BiLSTM-Mutilhead-Attention卷积双向长短期记忆神经网络融合多头注意力机制多变量时间序列预测

多维时序 | Matlab实现CNN-BiLSTM-Mutilhead-Attention卷积双向长短期记忆神经网络融合多头注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现CNN-BiLSTM-Mutilhead-Attention卷积双向长短期记忆神经网络融合多头注意力机制多变量时间序列预测效果一览基本介绍程序设计…

scipy测试数据

文章目录 图像心电图 图像 scipy的datasets中提供了几组在图像和信号处理中可能会用到的数据&#xff0c;但是&#xff0c;如果想顺利使用&#xff0c;还需要安装一个scipy的依赖模块pooch pip install pooch然后就可以加载这几种数据了 from scipy.datasets import ascent,…

云服务器搭建coturn出现Not reachable?

文章目录 问题复现解决方案1. 云服务器端口开放问题2. 检查配置文件3. 浏览器 问题解决 问题复现 使用云服务器搭建coturn服务时&#xff0c;出现not reachable报错 ICE Server配置是正确的 但测试relay时却报错&#xff1a;not reachable? 并且服务器也没输出相应日志。 …

Windows命令大全

文章目录 1. 文件和目录管理2. 系统信息查询3. 系统维护与修复4. 网络相关5. PowerShell 命令6. 用户管理7. 进程和服务管理8. 文件搜索与查找9. 时间和日期操作10. 注册表操作 Windows系统命令非常丰富&#xff0c;涵盖了操作系统管理、文件操作、网络配置、系统维护等诸多方面…

Java网络编程——UDP通信原理

一、TCP和UDP概述 传输层通常以TCP和UDP协议来控制端点与端点的通信 TCPUDP协议名称传输控制协议用户数据包协议是否连接面向连接的协议。数据必须要建立连接无连接的协议&#xff0c;每个数据报中都给出完整的地址信息&#xff0c;因此不需要事先建立发送方和接受方的连接是…

FPGA 多路分频器实验

1 概述 在 FPGA 中&#xff0c;时钟分频是经常用到的。本节课讲解 2 分频、3 分频、4 分频和 8 分频的 Verilog 实现并且学习 generate 语法功能的应。 2 程序设计思路 1&#xff09;整数倍分频&#xff0c;为 2、4、8&#xff0c;这种 2^n 次方倍数倍数关系的…

记一次DateTimeFormat注解的坑

记一次DateTimeFormat注解的坑 背景&#xff1a;在用Echarts做图表时&#xff0c;前端传两个日期参数&#xff0c;获取日期区间的图表数据。想遵循RESTful风格&#xff0c;所以使用get请求获取date参数。前端读取当前日期&#xff0c;将七天前日期和当前日期作为参数传给后端&…

享元模式介绍

目录 一、享元模式介绍 1.1 享元模式定义 1.2 享元模式原理 1.2.1 享元模式类图 1.2.2 模式角色说明 1.2.3 示例代码 二、享元模式的应用 2.1 需求说明 2.2 需求实现 2.2.1 类图 2.2.2 具体实现 2.2.2.1 抽象享元类 2.2.2.2 共享享元类-白色棋子 2.2.2.3 共享享元…

JAVA SECS发送Report C#处理SECS Report SECS发送事件资料大全 S6F11 建立通讯S1F13

发送S6F11非常简单&#xff0c;只需5~6行代码&#xff0c;最核心是代码清晰易懂。 任何人都可以一看就能上手&#xff0c;如果说用代码可读性作为不可替代性的壁垒就无话可说了。 private void buttonS6F11_Click(object sender, EventArgs e) {int nTransaction 0;// 数据部…

Rust之旅 - Rust概念、Windows安装、环境配置

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 系列专栏目录 [Java项目…

【SpringBoot】SpringBoot 项目初始化方法

github 搜索 springboot 模板 github 搜索 springboot 模板&#xff0c;拉取现成代码。 SpringBoot 官方的模板生成器 SpringBoot 官方的模板生成器&#xff08;https://start.spring.io/&#xff09; 在 IDEA 开发工具中生成 这里我修改成阿里的镜像主要是要使用 Java8。 …

制作一个Python聊天机器人

我们学习一下如何使用 ChatterBot 库在 Python 中创建聊天机器人&#xff0c;该库实现了各种机器学习算法来生成响应对话&#xff0c;还是挺不错的 什么是聊天机器人 聊天机器人也称为聊天机器人、机器人、人工代理等&#xff0c;基本上是由人工智能驱动的软件程序&#xff0…

最多购买宝石数目 - 华为OD统一考试

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 橱窗里有一排宝石&#xff0c;不同的宝石对应不同的价格&#xff0c;宝石的价格标记为 gems[i],0<i<n, n gems.length 宝石可同时出售0个或多个&#xff…