当前位置: 首页 > news >正文

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-初识正则表达式 以及 练习

目录 什么是正则表达式&#xff1f; 1. 正则表达式---字符类&#xff08;一个大括号匹配一个字符&#xff09;&#xff1a; 2. 正则表达式---预字符类&#xff08;也是匹配一个字符&#xff09;&#xff1a; 正则表达式---数量词 &#xff08;可以匹配多个字符&#xff09;…...

【Flutter 问题系列第 80 篇】TextField 输入框组件限制可输入的最大长度后,输入的内容中包含表情符号时,获取输入的内容数还是会超出限制的问题

这是【Flutter 问题系列第 80 篇】&#xff0c;如果觉得有用的话&#xff0c;欢迎关注专栏。 博文当前所用 Flutter SDK&#xff1a;3.10.5、Dart SDK&#xff1a;3.0.5 一&#xff1a;问题描述 在输入用户名称、简介等内容时&#xff0c;一般我们都会限制输入框内最大可输入…...

漏洞检测和评估【网站子域扫描工具02】

上一篇&#xff1a;爬取目标网站的域名和子域名【网站子域扫描工具01】 在Python中&#xff0c;有一些流行的漏洞扫描库可以对子域进行漏洞扫描和评估&#xff0c;比如Nmap、Sublist3r等。 1.端口扫描 以下是一个简单的示例代码&#xff0c;展示了如何使用Nmap进行基本的端口扫…...

压力测试+接口测试(工具jmeter)

jmeter是apache公司基于java开发的一款开源压力测试工具&#xff0c;体积小&#xff0c;功能全&#xff0c;使用方便&#xff0c;是一个比较轻量级的测试工具&#xff0c;使用起来非常简单。因 为jmeter是java开发的&#xff0c;所以运行的时候必须先要安装jdk才可以。jmeter是…...

LeetCode 46 全排列

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

npm install 无反应 npm run serve 无反应

说明情况&#xff1a;其实最开始我就是发现我跟着黑马的苍穹外卖的前端day2的环境搭建做的时候&#xff0c;到这一步出现了问题&#xff0c;无论我怎么 npm install 和 npm run serve 都没有像黑马一样有很多东西进行加载&#xff0c;因此我换了一种方法 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记录 失败&#xff01;超出限制双指针法 四数之和 leetcode18 三数之和 leetcode15 知识补充&#xff1a; map的key值必须是可以比较运算的类型&#xff0c;不可以是函数、map、slice map记录 失败&#xff01;超出限制 //得到结果后再去重 失…...

Mysql三种常用的删除方式

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

Eureka 本机集群实现

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

查看神经网络中间层特征矩阵及卷积核参数

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

重置aws上的ssh默认登录端口

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

算法刷题——拿出最少数目的魔法豆(力扣)

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

Linux消息队列

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

计算机网络——数据链路层(1)

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

移动端开发进阶之蓝牙通讯(四)

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

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框架开发的时候&#xff0c;经常会在controller类中看到 HttpServletRequest 对象参数&#xff0c;一般我们都是直接使用&#xff0c;但是它是何时、怎么注入到 spring 容器的呢 &#xff1f;另外以成员变量注入的 request 是线程安全的吗 ? Controller public c…...

浅聊雷池社区版(WAF)的tengine

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

如何安装配置VisualSVN服务并实现公网访问本地服务【内网穿透】

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

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目&#xff0c;该项目是一个 Spring AI 快速入门的样例工程项目&#xff0c;旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计&#xff0c;每个模块都专注于特定的功能领域&#xff0c;便于学习和…...