正则表达式必知必会
文章目录
- 前言
- 匹配单个字符
- 匹配任意字符
- 匹配一组字符
- 取非匹配
- 元字符
- 匹配数字
- 匹配所有字母和数字
- 匹配空白字符
- 重复匹配
- 避免过度匹配
- 边界匹配
- 字符串边界
- 子表达式
- 回溯引用
- 回溯引用中的替换操作
- 向前查找
- 向后查找
前言
在工作中使用正则表达式可以提高我们的效率,这篇博客就是一篇字典类型的博客,需要的时候回来看即可。但我尽量避免死记硬背。(学习书籍----《正则表达式必知必会》)
匹配单个字符
如果匹配单个字符的话,直接输入要查找的内容即可:
匹配字符“hello”,直接搜索即可:

匹配任意字符
匹配任意字符可使用符号“.”,它可以代替任何一个符号。
匹配字符“hello”,前后使用“.”来代替:

匹配一组字符
匹配一组字符可以使用“[]”,它的含义是只要这一个字符在这个中括号当中,就可以被匹配到。
匹配a到d的text,如下操作:

也可以直接输入[a-d] 表示a到d之前的任意一个符号都可以被匹配到

数字也可以使用区间符号“-”进行匹配,如下匹配带有字母和数字的两个字的文本:

一个集合里可以支持多个区间,如下匹配a到f或者1到3的一个字的文本:

取非匹配
如果我们想避免匹配到某些字符,可以使用符号“^”,表示不匹配这些区间里的任意一个字符,注意:这个符号只有在区间里表示取非。
匹配纯字母的文本,忽略掉数字:

元字符
元字符的概念是无法用它本身来表示它本身,需要进行转义,因为它是用来描述其他正则规则的,如果要想匹配元字符,就需要特殊处理。
比如上面的区间符号[],如果要想直接匹配是行不通的,如下并没有匹配成功:

针对匹配元字符的场景,需要使用转义符“\”。
如下操作即可匹配成功:

同理,“\”本身也是元字符,匹配的时候也需要使用“\”转义

匹配数字
\d表示匹配所有数字(digit)
\D表示匹配所有非数字,在正则中,小写对应的大写都是取非的意思。
匹配所有数字:

匹配所有非数字

匹配所有字母和数字
\w 匹配所有字母+数字(word)
\W 匹配所有非字母+数字
匹配所有字母+数字:

匹配所有非字母+数字

匹配空白字符
\s 表示匹配所有空白符号 (space)
\S 表示匹配所有非空白符号
匹配所有空白字符:

匹配所有非空白字符:

重复匹配
“+” 表示匹配一个或者多个字符(至少一个)
匹配my后面加上任意几个数字的文本:

“+”表示至少匹配一个
“*”表示匹配0个或多个,类似sql 中的select * … 意味着也可以没有
匹配my后面加上任意几个数字(也可以没有数字)的文本:
“?”表示匹配0个或1个字符,最多出现一次
匹配my后面加上1个数字(也可以没有数字)的文本:

"{}“可以给重复匹配设立一个精确的值,想要匹配几次,“{}”里填入对应的数字即可。
匹配数字出现3次的文本:

除了上面使用的方法外,”{}"还可以设立一个区间,比如“{2,4}” 表示出现至少2次,最多3次。
匹配数字出现至少1次,最多3次的文本:

除此之外,“{}” 还可以匹配至少出现几次,“{2,}” 表示至少出现几次,但最多没有上限(但是反过来不会生效,即匹配最多次,不需匹配最少次)。
匹配数字出现至少2次,最多N次的文本:

避免过度匹配
“*” 符号可以匹配多个,但有时会出现过度匹配的情况,如下,我想匹配所有的txt文本,但是会从头匹配到尾,会包含中间的空格

出现上述原因是因为开头是my, 结尾是txt,所以就都会匹配上。
解决方法可以使用“ *?” ,在“ * ” 后面加一个“?”,表示避免匹配过度,该含义是 只会匹配每一个以my开头,txt结尾的文本。

“ * ” 表示贪婪匹配,“ *?” 表示懒惰型匹配,常用的几个贪婪型匹配和对应的懒惰型匹配如下:
| 贪婪型 | 懒惰型 |
|---|---|
| * | *? |
| + | +? |
| {n,} | {n,}? |
边界匹配
“\b” 可以匹配单词的边界 (border)它可以独立出一个单词
我想匹配如下文本中的所有cat 单词,如果直接匹配的话,效果如下:

不符合我的预期,会匹配其他包含cat字母的单词;可以加上 \b ,表示对要搜索的单词加上一个边界:

相反,“\B”可以去除单词的边界

字符串边界
“^”表示匹配字符串的开头
“$”表示匹配字符串的结尾
匹配所有以a开头d结尾的文本行:

子表达式
“()”表示子表达式,它可以实现复用,将“()”里面的的内容抽出来,作为独立的元素来使用。
匹配下面的ip:

这个解释下:
(\d{1,3}.) 把1到3位的数字加上一个.作为一个子表达式
{3} 表示前面的子表达式连续出现了3次,也就是ip地址的前3组数字
\d{1,3}表示匹配ip的最后一组数字
再举一个例子,找出所有19世纪和20世纪的出生人的年份:

(19|20)表示19或者20开头,把它作为一个子表达式
\d{2}表示后面跟随2位数字
回溯引用
回溯引用的概念是模式的后半部父引用在前半部分中定义的子表达式。
找出单词连续出现两次的文本:

[ ]+(\w+)[ ]+ 表示匹配空格+多个字符+空格 中间的多个字符是一个子表达式
\1 表示再续上一个和前面第1个子表达式一模一样的内容
再举一个例子
如下匹配所有对应html内容:

(<[h]\d>)是一个子表达式,匹配开头
.*匹配所有中间内容
\1 表示前面的第1个子表达式的内容在这里再出现一次。
这样就会过滤掉最后一个标签,因为它开头是H3,结尾是H2,不符合预期。
\1 就表示前面的第1个子表达式,\n就表示前面的第n个子表达式
回溯引用中的替换操作
回溯引用不仅可以用来搜索,还可以用来替换。需要两个正则表达式,一个用来搜索,一个用来替换之前的文本,第一个模式里的子表达式可以在第二个模式里使用。
将所有电话的开头加上括号:

结果:

当匹配出来之后,用“$n” 来表示第一个模式中的第n个子表达式。
向前查找
有些时候,被匹配的单词并不是我们想要的,我们只是拿它作为一个边界,但搜索出来的内容不应该包含它。
向前查找实际上是一个子表达式,是以“?=”开头的,需要匹配的文本跟在“=”的后面。
匹配http 或https,但是不包括后面的“:”

.* 表示匹配开头
(?=:)是向前查找,查找到“:”即可,但是不包含“:”,只是“:”之前的即可,所以叫向前查找。
向后查找
?<=
向后查找相对于向前查找来说增加了一个“<”,含义为查找小于“=”后面的内容,即向后查找。

感谢您的观看,欢迎一起探讨。
相关文章:
正则表达式必知必会
文章目录 前言匹配单个字符匹配任意字符匹配一组字符取非匹配元字符匹配数字匹配所有字母和数字匹配空白字符重复匹配避免过度匹配边界匹配字符串边界子表达式回溯引用回溯引用中的替换操作向前查找向后查找 前言 在工作中使用正则表达式可以提高我们的效率,这篇博…...
[SQL系列] 从头开始学PostgreSQL 分库分表
什么是分库分表 分库分表是一种数据库架构设计的方法,用于应对大规模数据的存储和查询。当单个数据库的存储容量或查询性能无法满足需求时,可以通过将数据分散存储在多个数据库服务器上,以提高系统的可扩展性和性能。 分库分表通常包…...
【VScode】Remote-SSH XHR failed无法访问远程服务器
问题概述 当使用VScode连接远程服务器时,往往需要使用Remote-SSH这个插件。而该插件有一个小bug,当远程服务器网络不佳时容易出现。 在控制台会出现下述语句: Resolver error: Error: XHR failed at y.onerror (vscode-file://vscode-app/…...
pycharm打开terminal报错
Pycharm打开终端报错如何解决?估计是终端启动conda不顺利,需要重新设置路径。参考以下文章的做法即可。 Windows下Pycharm中Terminal无法进入conda环境和Python Console 不能使用 给pycharm中Terminal 添加新的shell,才可以使用conda环境 W…...
C#与C/C++交互(1)——需要了解的基础知识
【前言】 C#中用于实现调用C/C的方案是P/Invoke(Platform Invoke),让托管代码可以调用库中的函数。类似的功能,JAVA中叫JNI,Python中叫Ctypes。 常见的代码用法如下: [DllImport("Test.dll", E…...
LeetCode笔记:Weekly Contest 356
LeetCode笔记:Weekly Contest 356 1. 题目一 1. 解题思路2. 代码实现 2. 题目二 1. 解题思路2. 代码实现 3. 题目三 1. 解题思路2. 代码实现 4. 题目四 1. 解题思路2. 代码实现 比赛链接:https://leetcode.com/contest/weekly-contest-356/ 1. 题目一…...
2 Python的基础语法
概述 在上一节的内容中,我们介绍了Python的诞生、发展历程、特色、缺点和应用领域。从本节开始,我们将正式学习Python。Python是一门简洁和优雅的语言,有自己特殊的一些语法规则。因此,在介绍Python编程的有关知识之前,…...
抖音seo矩阵系统源代码开发搭建技术分享
抖音SEO矩阵系统是一个较为复杂的系统,其开发和搭建需要掌握一定的技术。以下是一些技术分享: 技术分享 抖音SEO矩阵系统的源代码可以使用JAVA、Python、PHP等多种语言进行开发。其中,JAVA语言的应用较为广泛,因为JAVA语言有良好…...
python#django数据库一对一/一对多/多对多
一对一OneToOneField 用户和用户信息 搭建 # 一对一 class TestUser(models.Model): usernamemodels.CharField(max_length32) password models.CharField(max_length32) class TestInfo(models.Model): mick_namemodels.CharField(max_length32) usermode…...
记RT-Thread rt_timer_start函数的问题
我使用的RT-Thread版本为4.0.3。 我看了5.0.1的代码,此问已经被修复。 在4.0.3版本中的rt_timer_start函数源码如下: rt_err_t rt_timer_start(rt_timer_t timer) {unsigned int row_lvl;rt_list_t *timer_list;register rt_base_t level;rt_list_t *r…...
C++初阶——拷贝构造和运算符重载(const成员)
目录 1. 拷贝构造函数 1.2 拷贝构造函数特征: 2. 默认拷贝构造函数 2.1 未显式定义,编译器会生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝 3. 运算符重载 3.1…...
go练习 day01
DTO: note_dto.go package dtoimport "king/model"type NoteAddDTO struct {ID uintTitle string json:"title" form:"title" binding:"required" message:"标题不能为空"Content string json:"conten…...
C# Blazor 学习笔记(0.1):如何开始Blazor和vs基本设置
文章目录 前言资源推荐环境如何开始Blazor个人推荐设置注释快捷键热重载设置 前言 Blazor简单来说就是微软提供的.NET 前端框架。使用 WebAssembly的“云浏览器”,集成了Vue,React,Angular等知名前端框架的特点。 资源推荐 微软官方文档 Blazor入门基础视频合集 …...
原码的乘法运算 补码乘法运算
补码乘法 对比...
找不到d3dx9_43.dll丢失怎么解决(分享几种解决方法)
为什么我们打开电脑软件或许游戏时候,电脑会报错出现d3dx9_43.dll丢失,或许找不到d3dx9_43.dll等等的提示。下面来详细介绍一下d3dx9_43.dll详细解决方法跟d3dx9_43.dll是什么。 如果你的系统中没有安装或安装不完整的d3dx9_43.dll运行时,应…...
篇四:建造者模式:逐步构造复杂对象
篇四:“建造者模式:逐步构造复杂对象” 设计模式是软件开发中的重要组成部分,建造者模式是创建型设计模式中的一种。建造者模式旨在逐步构造复杂对象,将对象的构造与其表示分离,从而使得同样的构建过程可以创建不同的…...
vs导出和导入动态库和静态库
1. 动态库和导出和导入 1.1 动态库的导出 1. 创建新项目 新建新项目,选择动态链接库(DLL)。 填写项目名称,并选择项目保存的路径,然后点击创建。 创建完成后,会自动生成如下所示文件,可以根据…...
30 使用easyExcel依赖生成Excel
30.1 导入依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.6</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId&…...
排序进行曲-v2.0
文章目录 小程一言直接插入排序步骤举例复杂度分析应用场景实际举例代码实现 希尔排序步骤举例复杂度分析应用场景实际举例代码实现 堆排序步骤举例复杂度分析应用场景实际举例代码实现 小程一言 这篇文章是在排序进行曲1.0之后的续讲, 由于在上一篇讲的排序的基本…...
反弹shell的N种姿势
预备知识1. 关于反弹shell 就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端。reverse shell与telnet,ssh等标准shell对应,本质上是网络概念的客户端与服务端的角色反转。2. 反弹shel…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...
WEB3全栈开发——面试专业技能点P7前端与链上集成
一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染(SSR)与静态网站生成(SSG) 框架,由 Vercel 开发。它简化了构建生产级 React 应用的过程,并内置了很多特性: ✅ 文件系…...
VSCode 使用CMake 构建 Qt 5 窗口程序
首先,目录结构如下图: 运行效果: cmake -B build cmake --build build 运行: windeployqt.exe F:\testQt5\build\Debug\app.exe main.cpp #include "mainwindow.h"#include <QAppli...
高保真组件库:开关
一:制作关状态 拖入一个矩形作为关闭的底色:44 x 22,填充灰色CCCCCC,圆角23,边框宽度0,文本为”关“,右对齐,边距2,2,6,2,文本颜色白色FFFFFF。 拖拽一个椭圆,尺寸18 x 18,边框为0。3. 全选转为动态面板状态1命名为”关“。 二:制作开状态 复制关状态并命名为”开…...
