快速掌握正则表达式
文章目录
- 限定符 Qualifier
- 第一个常用限定符 ?
- 第二个常用限定符 *
- 第三个常用限定符 +
- 或运算符
- 字符类
- 元字符 Meta-characters
- \d 数字字符
- \w 单词字符
- 空白符 `\s`
- `.`任意字符
- `^` `$` 行首行尾
- 贪婪与懒惰匹配 Greedy vs Lazy Match
- 实例 1 :RGB颜色匹配
- 实例 2 :IPv4地址匹配
- 总结
正则表达式,你可以把它当做是通配符的增强版,它所做的事情呢,就是去帮你匹配指定规则的字符串,而且它在计算机中的应用可能远比你想象的要多得多。
我们平时编译器中的词法分析器会使用正则表达式去匹配代码中的关键字,网站上注册表单或用到正则表达式去判断密码的复杂程度。在爬虫中,我们同样可以使用正则表达式。提取我们需要的信息,
那我们先来介绍一下,今天要用到的一些工具,为了测试你写的正则表达式呢,这里有很多种办法,我们可以使用编辑器内置的搜索工具。比如,在VS code搜索框的最右边,我们可以点选这个图标,
使用正则表达式去搜索字符串。

当然,我们也可以在自己熟悉的编程语言中调用函数去测试它。不过这里我推荐一个在线的测试工具,下面是你要测试的文本,上面是正则表达式。左边可以选择正则表达式,在不同语言下的变体,右边是一些帮助信息和参考文档,这里我们随便粘贴一段文字来测试一下,如果我们在上方输入任意表达式。被成功匹配的文本则会以高亮的形式显示出来,那么首先来看一下正则表达式中最基础的用法。
限定符 Qualifier
第一个常用限定符 ?
我们现在上方输入我们的第一个正则表达式,** 这里的问号呢?在正则表达式中是一个特殊的字符,它是一个限定符,它代表前面的这个字符d需要出现零次或者一次。 ** 说简单点就是d这个字符可有可无,可以看到我们用这个表达式呢,可以去匹配use这个单词,同样可以去匹配used。

第二个常用限定符 *
第二个常用到的限定符是星号,它会去匹配零个或者多个字符,比如这里我们输入AB星号c。
星号在这里代表b可以没有,也可以出现多次,那可以看到它成功匹配了下面的ac abc abbbc,但是没有去匹配adc。因为我们表达式中明确规定了a和c中间只能出现零个或者多个b。

第三个常用限定符 +
第三个限定符,是我们这里的加号(+)和星号(*)不同的是它会匹配出现一次以上的字符 。如果我们把这里的星号改成加号,可以看到第一个ac就没有被成功匹配了。

如果我们要做到更精确的匹配,比如我们要指定这个。里b出现的次数为六次,我们可以使用花括号,比如这里在花括号里面写上六。

那使用花括号呢,同时允许我们输入一个范围。比如,我们希望字符出现的次数为2到6之间,我们可以写成花括号二,逗号六。

如果我们希望字符出现的次数为两次以上。我们可以直接省略这里的这个六。

那所有的限定符在这里就讲完了,不过之前限定符的对象是一个字符。如果我们希望去匹配多个字符的重复,那么应该怎么办呢?比如在这个例子中,我们想去匹配中间多次出现的这个ab。我们可以先将ab用括号括起来,然后再在后面添加限定符,可以看到这个正则表达式成功匹配了这里多次ab的出现。

接下来我们来看一下正则表达式中的或运算符。
或运算符
比如这里我们要去匹配a cat或者a dog,我们可以将正则表达式写成这样,那这里前面呢?
会先去匹配a空格,后面括号中内容代表,要么是cat,要么是dog,中间以竖线隔开,并且注意这里的括号是必不可少的,否则就变成了要么是a cat,要么是dog。


字符类
那另一个与运算符相关的是字符类,比如我们想要匹配由ABC这几个字母构成的单词,我们可以写作方括号ABC([abc]),方括号里的内容呢?代表要求匹配的字符只能取自于它们,另外我们可以在方括号里指定字符的范围,比如a杠z([a-z])代表所有的小写英文字符,那大写的a杠z([A-Z])代表所有的大写英文字符。


[a-zA-Z0-9]代表所有的英文字符和数字。

如果在方括号的前面,我们写一个尖号,则代表要求匹配,除了尖号,后面列出的以外的字符,比如[^0-9]。代表所有的非数字字符,但这里面包含换行符。

元字符 Meta-characters
\d 数字字符
另外正则表达式中其实为我们预先定义好了一系列常用的字符类型,比如数字、空白符、单词开头结尾等等。它们被称作元字符。这个表达式中的大多数元字符都是以反斜杠开头。\d代表数字字符。等同于之前写的[0-9]。

\w 单词字符
\w代表单词字符,也就是所有的英文字符、数字,加上下划线。

空白符 \s
\s代表空白符,它同时包含tab字符以及换行符。这个需要注意一下。

另外,与\d相对应的,大写的\D代表非数字字符。与\w相对应的,大写的\W代表非单次字符。与\s相对应的,大写的\S代表非空白字符



.任意字符
句点呢?在正则表达式中也是一个特殊的字符,它代表任意字符,但不包含换行符。


^ $ 行首行尾
另外,这里呢,还有两个特殊的字符,间号(^)呢,会去匹配行首,美元符号($)会去匹配行尾,比如尖号a(^a)只会去匹配行首的A。A美元符号(a$)只会去匹配行尾的a。


贪婪与懒惰匹配 Greedy vs Lazy Match
接下来我们来介绍一下正则表达式中的一些高级概念。
那之前我们讲到的星号(*)、加号(+),花括号({})在匹配字符串的时候默认会去匹配尽可能多的字符,比如在下面的例子中,我们想去匹配这里面的HTML标签,比如这里的<span>和<b>。我们自然会想到这样的正则表达式,但这里可以看到,这个正则表达式会直接把整个字符串都全部匹配了,原因是因为中间的这个点加号会匹配尽可能多的字符。

我们知道点能代表任意字符。自然也会匹配右尖括号(>),因此才会有这样的结果,但是解决方法也很简单,我们只需要在加号右边加一个问号(?)就好了,它会将正则表达式中默认的贪婪匹配(Greedy Match)切换为懒惰匹配(Lazy Match),这招在实际使用中也会经常被用到。

实例 1 :RGB颜色匹配
比如这里我们想要匹配文本中出现的所有16进制的rgb颜色值。我们可以首先去匹配前面的井号,那接下来呢,因为代表每一个颜色值的字符都是16进制,因此它们只能取自于a到f之间或者大写的A到F或者0到9之间。并且字符一定需要出现六次。
最后我们可以在表达式末尾加入杠b(\b)来代表单词字符的边界。这样可以避免这里不符合要求的文本也被识别成rgb颜色值。

实例 2 :IPv4地址匹配
在第二个例子中,我们来讲一下IP地址的匹配IPV 4的地址呢,实际上是由四段数字构成,数字之间由据点隔开。如果要在文本中提取所有出现的IP地址,我们可以直接使用下面这种正则表达式杠d(\d)加号会匹配任何长度大于一的数字。杠句点(\.)代表句点这个字面量,因为句点在正则表达式中是一个特殊的符号,所以我们需要在这里用反斜杠做转义。

可以看到,这里正在表达式也成功的帮我们匹配了这四个结果。不过,这里有一个问题,我们知道IP地址的每一部分都是八位的数字。也就是说,它的范围介于0到255之间,但这里的这个数字显然已经超出了范围,但是还是被正则表达式成功匹配了。
所以如果这里我们要做改良的话呢,我们可以使用下面这段逻辑,我们先来看IP地址被句点隔开的每一部分。
- 如果它的前两位是二五,那么最后一位只能取0到5之间的数字;
- 如果它的第一位是二,第二位是0到4之间的数,那么最后一位可以取0到9之间的任意值。这里用杠d代替;
- 如果它第一位是零或者一,那么最后两位可以取00到99之间的任意数字,我们用杠d(
\d)杠d(\d)代替;- 但是我们也知道IP地址的每一部分呢,也可以由两位数字构成,甚至是一位这样都是合法的,因此呢,我们可以直接将这里的第一个数字和第三个数字后面都加一个问号(
?)。就可以表示这种情况了。数字的部分呢,我们就匹配完了。
- 但是我们也知道IP地址的每一部分呢,也可以由两位数字构成,甚至是一位这样都是合法的,因此呢,我们可以直接将这里的第一个数字和第三个数字后面都加一个问号(
接下来我们来匹配后面的句点之后呢,我们将全部表达式用括号(())括起来。这一段((25[0-5]|2[0-4]\d|[01]?\d\d?)\.)呢,我们要求重复匹配三次,正则的表达式会匹配IP地址的前三段,并且包含每段后面的句点。至于最后面的一段数字,我们只需要将匹配第一段数字的这个部分((25[0-5]|2[0-4]\d|[01]?\d\d?))复制过来即可,最后呢,我们在首尾都加入杠b(\b)来匹配字符的边界。可以看到,经过改良版的正则表达式,可以成功的匹配这里的三个IP地址,并且把不符合要求的这个排除在外了。但这个例子呢,也比较复杂。

最后呢,我列了个表,总结一下讲到的所有要点。但是在正则表达式中,其实还有许多没有讲到的高级概念。比如补货断言递归平衡组等等。
总结
- 限定符
a*:a出现0次或多次a+:a出现1次或多次a?:a出现0次或1次a{6}:a出现6次a{2,6}:a出现2-6次a{2,}:a出现两次以上
- 或运算符
(a|b):匹配a或者b(ab)|(cd):匹配ab或者cd
- 字符类
[abc]:匹配a或者b或者c[a-c]:同上[a-fA-F0-9]:匹配小写+大写因为字符以及数字[^0-9]:匹配非数字字符
- 元字符
\d:匹配数字字符\D:匹配非数字字符\w:匹配单词字符(英文、数字、下划线)\W:匹配非单词字符\s:匹配空白符(包括换行符、Tab)\S:匹配非空白符.:匹配任意字符(换行符除外)\bword\b:\b标注字符的边界^:匹配行首$:匹配行尾
- 贪婪/懒惰匹配
<.+>:默认贪婪匹配“任意字符”<.+?>:懒惰匹配“任意字符”
相关文章:
快速掌握正则表达式
文章目录 限定符 Qualifier第一个常用限定符 ?第二个常用限定符 *第三个常用限定符 或运算符字符类元字符 Meta-characters\d 数字字符\w 单词字符空白符 \s.任意字符^ $ 行首行尾 贪婪与懒惰匹配 Greedy vs Lazy Match实例 1 :RGB颜色匹配实例 2 &…...
git: ‘lfs‘ is not a git command unclear
首先可以尝试 git lfs install 是否可以,不可以后就看这个连接:https://stackoverflow.com/questions/48734119/git-lfs-is-not-a-git-command-unclear。 我的是ubuntu,所以: 保证这个前提: git-lfs requires git ve…...
代码随想录--哈希--两个数组的交集
题意:给定两个数组,编写一个函数来计算它们的交集。 说明: 输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序。 import java.util.ArrayList; import java.util.HashMap; import java.util.List;public class SSS {public …...
基于腾讯文档进行应届生个人求职记录
1. 新建一个腾讯文档 电脑登录QQ,点击“腾讯文档”功能键。 2. 可以选择下载客户端,也可以直接进入网页版。(本人使用网页版) 3. 点击新建,选择在线表格。 4. 编辑表名,表内容。 5. 设置文档权限…...
计算机视觉实战项目(图像分类+目标检测+目标跟踪+姿态识别+车道线识别+车牌识别)
图像分类 教程博客_传送门链接:链接 在本教程中,您将学习如何使用迁移学习训练卷积神经网络以进行图像分类。您可以在 cs231n 上阅读有关迁移学习的更多信息。 本文主要目的是教会你如何自己搭建分类模型,耐心看完,相信会有很大收获。废话不…...
(18)线程的实例认识:线程的控制,暂停,继续,停止,线程相互控制,协作
话不多,但比较中肯,本文参照c# 线程暂停继续的实现方式_哔哩哔哩_bilibili 一、老方式 1、这是一个老的实现方式,基本不推荐,背后控制的原理需要了解。 界面:三个button一个textbox …...
c#动态保留小数位数的数值格式化方法实例----从小数点后非零数字保留两位进行四舍五入
c#动态保留小数位数的数值格式化方法实例----从小数点后非零数字保留两位进行四舍五入 功能介绍代码案例输出结果封装扩展方法控制台调用 其他方法地址 功能介绍 1. 输入的数字是整数,则直接返回整数部分的字符串表示。 2. 如果输入的数字是小数,则执行…...
大数据精准营销大数据平台应用场景有哪些,平台优势有哪些?
精准营销大数据平台应用场景有很多种,比如在银行领域,我通过相应的客户数据,也可以给客户推广一些银行业务。还可以运用于证券行业,除此之外还可以运用于保险或者信托行业,借助精准营销大数据平台可以进行主动营销。那…...
Pyspark案例综合(数据计算)
数据计算 map方法 map算子 map算子(成员方法)接受一个处理函数,可用lambda快速编写,对RDD内的元素一一处理,返回RDD对象 链式调用 对于返回值是新的RDD的算子,可以通过链式调用的方式多次调用算子 &q…...
电路电子技术1--关联参考方向及功率的计算
1.判断 电流由元件的低点位端流向高电位端的参考方向称为关联参考方向。() 考点:电流、电压的参考方向 解释:在一些复杂的电路中,往往不能预先确定某段电路上的电流、电压的实际方向,所以引进了 “关联参考方向”。为了能够解决问…...
【C++】AVL树的插入操作实现以及验证是否正确(带平衡因子)
文章目录 前言一、AVL树结点的定义二、AVL树的插入(Insert)插入完整代码:1.左单旋(RotateL)2.右单旋(RotateR)3.先右单旋再左单旋(RotateRL)1.保存的bf为02.保存的bf为13…...
【Linux-Day10-信号量,共享内存,消息队列】
信号量 信号量描述 信号量是一个特殊的变量,一般取正数值。它的值代表允许访问的资源数目,获取资源 时,需要对信号量的值进行原子减一,该操作被称为 P 操作。 当信号量值为 0 时,代表没有资源可用,P 操作…...
使用IntelliJ IDEA本地启动调试Flink流计算工程的2个异常解决
记录:471 场景:使用IntelliJ IDEA本地启动调试Flink流计算时,报错一:加载DataStream报错java.lang.ClassNotFoundException。报错二:No ExecutorFactory found to execute the application。 版本:JDK 1.…...
对象及日期对象
对象 1.什么是对象 类是对象的抽象,对象是类的实例 程序算法数据结构 万物皆对象,对象是一个具体的事物,看到见摸得着,对象是一组无序相关属性和方法的集合(无序,所以对象没有length属性),所有事物都是对象,列如字符串,数值,数组,函数等. 属性:事物的特征,在对象中用属性表…...
鼠标滚轮编码器解析
文章目录 前言一、鼠标滚轮编码器逻辑?二、使用步骤 1.引入库2.读入数据总结 前言 鼠标滚轮编码器为三脚接入,一个COM脚C(一般是接地),两个脉冲波形输入脚A、B,转动滚轮编码器会在两个脉冲输入脚上产生脉冲…...
【PTA】攀拓(PAT)- 程序设计(甲级)2023年春季考试
个人学习记录,代码难免不尽人意。 今天又斥资买了今年春季的真题一试,呃,感觉尽力了,89分,在当年排名23,感觉还不错,没有出现读不懂的题目和没有思路的情况,扣的11分分别是第二题两个…...
Spring Cloud Gateway 实现原理
Spring Cloud Gateway是Spring Cloud生态系统中的一个组件,用于构建基于Spring Boot的微服务架构中的网关服务。它的主要目的是提供一种灵活的方式来路由、过滤和转换HTTP请求,从而允许您构建强大、高性能的微服务应用程序。 以下是Spring Cloud Gatewa…...
嘉泰实业:真实低门槛,安全有保障
在互联网金融大行其道的当下,无论用户是多么的青睐、喜爱这种便捷的理财方式,也一定得把资金安全放在心上。要投就投那些实力背景雄厚,诚信经营的平台,可以选择投资用户基数庞大的理财老品牌,也可以选择发展势头迅猛的…...
spring boot 2.7 -> 3.0升级指南
spring boot提供一个版本迁移指南 2.7 -> 3.0...
MQTT 连接优化指南
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
