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 的缩写,是一个开放源代码的版本控制系统…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...

