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));//trueString 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 插件
本章介绍了正则表达式,以及规则、校验字符串是否满足规则的重要作用。
下篇介绍第二个重要作用:在一段文本中查找满足要求的内容
相关文章:

Java-初识正则表达式 以及 练习
目录 什么是正则表达式? 1. 正则表达式---字符类(一个大括号匹配一个字符): 2. 正则表达式---预字符类(也是匹配一个字符): 正则表达式---数量词 (可以匹配多个字符)…...

【Flutter 问题系列第 80 篇】TextField 输入框组件限制可输入的最大长度后,输入的内容中包含表情符号时,获取输入的内容数还是会超出限制的问题
这是【Flutter 问题系列第 80 篇】,如果觉得有用的话,欢迎关注专栏。 博文当前所用 Flutter SDK:3.10.5、Dart SDK:3.0.5 一:问题描述 在输入用户名称、简介等内容时,一般我们都会限制输入框内最大可输入…...

漏洞检测和评估【网站子域扫描工具02】
上一篇:爬取目标网站的域名和子域名【网站子域扫描工具01】 在Python中,有一些流行的漏洞扫描库可以对子域进行漏洞扫描和评估,比如Nmap、Sublist3r等。 1.端口扫描 以下是一个简单的示例代码,展示了如何使用Nmap进行基本的端口扫…...
压力测试+接口测试(工具jmeter)
jmeter是apache公司基于java开发的一款开源压力测试工具,体积小,功能全,使用方便,是一个比较轻量级的测试工具,使用起来非常简单。因 为jmeter是java开发的,所以运行的时候必须先要安装jdk才可以。jmeter是…...

LeetCode 46 全排列
题目描述 全排列 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1: 输入:nums [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2: 输入…...

npm install 无反应 npm run serve 无反应
说明情况:其实最开始我就是发现我跟着黑马的苍穹外卖的前端day2的环境搭建做的时候,到这一步出现了问题,无论我怎么 npm install 和 npm run serve 都没有像黑马一样有很多东西进行加载,因此我换了一种方法 1.在这个文件夹下cmd …...

JAVAEE初阶 文件IO(二)
文件IO 一. 文件流1.1 字节流 inputStream(1) try with resources方法 1.2 read方法(1) 第一个read方法(2) 第二个read方法(3) read的第三个方法 1.3 字节流 OutoutStream1.4 字符流(1) reader(2) writer 一. 文件流 1.1 字节流 inputStream 在字节流中,我们使用inputStream和…...

Golang 三数之和+ 四数之和 leetcode15、18 双指针法
文章目录 三数之和 leetcode15map记录 失败!超出限制双指针法 四数之和 leetcode18 三数之和 leetcode15 知识补充: map的key值必须是可以比较运算的类型,不可以是函数、map、slice map记录 失败!超出限制 //得到结果后再去重 失…...

Mysql三种常用的删除方式
前言 在 MySQL 中,有三种常用的方式可以删除表中的数据或整个表,它们分别是 TRUNCATE、DROP 和 DELETE。 TRUNCATE TABLE TRUNCATE TABLE属于DDL语言,不走事务,数据不会回滚 TRUNCATE TABLE 语句会删除表中的所有数据ÿ…...

Eureka 本机集群实现
距离上次发布博客已经一年多了,主要就是因为考研,没时间学习技术的内容,现在有时间继续完成关于代码方面的心得,希望跟大家分享。 今天在做一个 Eureka 的集群实现,我是在本电脑上跑的,感觉这个挺有意思&a…...

查看神经网络中间层特征矩阵及卷积核参数
可视化feature maps以及kernel weights,使用alexnet模型进行演示。 1. 查看中间层特征矩阵 alexnet模型,修改了向前传播 import torch from torch import nn from torch.nn import functional as F# 对花图像数据进行分类 class AlexNet(nn.Module):d…...

重置aws上的ssh默认登录端口
aws上的ec2机器,默认ssh的登录都是22,为了防止被黑,记录下修改该默认端口的方法 修改/etc/ssh/sshd_config文件,将Port 22注释去掉在上面的文件中,加入一行,你想要增加的端口号,格式和22一致注意࿱…...

算法刷题——拿出最少数目的魔法豆(力扣)
文章目录 题目描述我的解法思路结果分析 官方题解分析 查漏补缺更新日期参考来源 题目描述 传送门 拿出最少数目的魔法豆:给定一个正整数 数组beans ,其中每个整数表示一个袋子里装的魔法豆的数目。请你从每个袋子中拿出 一些豆子(也可以 拿…...

Linux消息队列
常用函数 //创建/获取消息队列 int msgget (key_t key, int msgflg); /* key : 为键值,ftok(); msgflg:IPC_CREAT - 创建,不存在即创建,已存在即获取,除非… IPC_EXCL - 排斥,已存在即失败。 */// 向消息队列发送消息 int msgs…...

计算机网络——数据链路层(1)
一、概述 在计算机网络中,数据链路层承担着点对点通信的任务,用于跨物理层在网段节点之间参数数据。它在网络分层中处于物理层之上,网路层之下。 在链路层的讨论中,我们将看到两种截然不同类型的链路层信道。第一种类型是广播信道…...

移动端开发进阶之蓝牙通讯(四)
移动端开发进阶之蓝牙通讯(四) 在移动端开发实践中,可能会要求在不同的设备之间切换,从而提升用户体验; 或者为了提升设备的利用率,实现设备之间的连接和协同工作; 不得不通过多端连接,将多个设备连接在一起,实现设备之间的数据共享、远程控制等功能,根据具体的应用…...

npm换源
检查现在的源地址 npm config get registry 使用淘宝镜像 npm config set registry https://registry.npm.taobao.org 使用官方镜像 npm config set registry https://registry.npmjs.org/...

Spring 中 HttpServletRequest 作为成员变量是安全的吗?
在使用spring框架开发的时候,经常会在controller类中看到 HttpServletRequest 对象参数,一般我们都是直接使用,但是它是何时、怎么注入到 spring 容器的呢 ?另外以成员变量注入的 request 是线程安全的吗 ? Controller public c…...

浅聊雷池社区版(WAF)的tengine
雷池社区版是一个开源的免费Web应用防火墙(WAF),专为保护Web应用免受各种网络攻击而设计。基于强大的Tengine,雷池社区版提供了一系列先进的安全功能,适用于中小企业和个人用户。 Tengine的故事始于2011年,…...

如何安装配置VisualSVN服务并实现公网访问本地服务【内网穿透】
文章目录 前言1. VisualSVN安装与配置2. VisualSVN Server管理界面配置3. 安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4. 固定公网地址访问 前言 SVN 是 subversion 的缩写,是一个开放源代码的版本控制系统…...

解析TZ字样的0时区UTC时间格式化为东八区
带TZ字样的0时区UTC时间格式化为东八区 TZ 的Z是zero timezone 0时区的意思。带TZ的时间是UTC0的时间SimpleDateFormat默认使用系统日历时区,必须手动指定0时区,才能正确解析TZ时间详细测试代码见下: SneakyThrows public static void main…...

python两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回…...

PBR材质背光面太暗优化
图形学中漫反射光照遵循兰伯特光照模型,它的公式如下 其中: :漫反射光颜色 :入射光颜色 :材质的漫反射系数 :法线方向 :光源方向 由于背光面的法线方向和光源方向的点积为负数,因此…...

【电力电子在电力系统中的应用】6 滞环电流控制的PWM整流器 + STATCOM整流器 + APF仿真
【仅供参考】 【2023.06西南交大电力电子在电力系统中的应用】 目录 步骤一:基于滞环电流控制的PWM整流器仿真 1.1 仿真要求 1.2 仿真电路原理及设计 1.2.1 主电路的搭建 1.2.2 控制电路的搭建 1.3 波形分析 步骤二:从PWM整流器到STATCOM仿真 2…...

接近8000字的SpringSpring常用注解总结!安排
接近8000字的Spring/Spring常用注解总结!安排 为什么要写这篇文章? 最近看到网上有一篇关于 SpringBoot 常用注解的文章被转载的比较多,我看了文章内容之后属实觉得质量有点低,并且有点会误导没有太多实际使用经验的人ÿ…...

51单片机_智能家居终端
实物演示效果: https://www.bilibili.com/video/BV1bh4y1A7ZW/?vd_source6ff7cd03af95cd504b60511ef9373a1d 51单片机是否适合做多功能智能家居控制系统?51单片机的芯片是否具有与WiFi通信的能力?如果有的话,具体有哪些芯片啊&a…...

css实现动态水波纹效果
效果如下: 外层容器 (shop_wrap): 设置外边距 (padding) 提供一些间距和边距 圆形容器 (TheCircle): 使用相对定位 (position: relative),宽度和高度均为 180px,形成一个圆形按钮圆角半径 (border-radius) 设置为 50%&…...

Chrome 开发者工具
Chrome 开发者工具 介绍控制面板时间线下载信息概要请求列表单个请求时间线优化时间线上耗时项 lighthouse 插件Performance(性能指标)Accessibility(可访问性)Best Practices(最佳实践)SEO(搜索…...

Error: error:0308010C:digital envelope routines::unsupported的解决方案
因为最近安装了pnpm对node版本有要求,升级了node版本是18以后,在运行之前的项目,就跑不起来了,报错如下: Error: error:0308010C:digital envelope routines::unsupported解决方案一: node版本切换到16版…...

vue基于spring boot框架的发艺美发店理发店管理系统的设计q9xpe
店铺信息、美发信息是发艺美发店管理系统的重要组成部分,信息清晰、详细、准确,能够有效地促进发艺美发店管理系统的运行[5]。基础设定函数是对整个系统的总体布局进行合理安排,包括:店铺活动、物品信息、领用信息等。通过对各类资…...