正则表达式学习和高级用法
以下所有的验证都在
在线验证
1. 起始符 /
正则表达式的起始符
2. 限定符
+
匹配前面的子表达式**1次或多次
**。例如,zo+
能匹配 "zo"
以及"zoo"
,但不能匹配 "z"
。+
等价于 {1,}
。
?
匹配前面的子表达式**0次或1次
**。例如,do(es)?
可以匹配 "do"
、 "does"
、 "doxy"
中的 "do"
和 "does"
。
?
等价于 {0,1}
。
*
匹配前面的子表达式**0次或多次**
。例如,zo*
能匹配 "z"
以及"zoo"
。*
等价于 {0,}
。
. 句点符
匹配除换行符外 /r
和 /n
的所有字符,但一次只能匹配一个
{ }
{n}
n
是一个非负整数。匹配确定的 n
次。例如,o{2}
不能匹配 "Bob"
中的 o
,但是能匹配 "food"
中的两个 o
。
{n,}
n
是一个非负整数。至少匹配n
次。例如,o{2,}
不能匹配 "Bob"
中的 o
,但能匹配 "foooood"
中的所有 o
。o{1,}
等价于 o+
。o{0,}
则等价于 o*
。
{n,m}
m
和 n
均为非负整数,其中 n <= m
。最少匹配 n
次且最多匹配 m
次。例如,o{1,3}
将匹配 "fooooood"
中的前三个 o
。o{0,1}
等价于 o?
。请注意在逗号和两个数之间不能有空格。
3. 普通字符
[ ]
所有的区间都会匹配一个结果返回
[ABC]
匹配包含在中括号中的所有字符,注意的是匹配的的字符不需要是连续的的,只要是在 [...]
中的字符就行,相当于字典。
[^ABC ]
和[ABC] 是取反的操作,表示不包含的匹配
区间操作 [A-Za-z0-0]
匹配某一区间的所有包含字符 例如匹配所有的中文[\u4e00-\u9fa5]
,这里是通过Unicode
4. 元字符
\d \D
配置所有的数字字符, 大写的表示取反 0-9
\w \W
匹配所有的 英文字母 + 数字 + 下划线
, 只能匹配一个,如果要匹配多个需要用到 \w+
\s \S
匹配任何空白字符
,包括空格、制表符、换页符
等等。
5. 逻辑运算符
与运算 (...)
括号内的做为一个整体匹配
或运算符 |
指明两项之间的一个选择。要匹配 |
,请使用 \|
A(ab|cd)D
两个匹配一个
6. 定位符
$
字符串结尾符
表示匹配的所有字符在句尾
^
首字符匹配
在中括号中[ ]
表示取反
\b
\B
边界匹配符
将两个空个之间的字符整体作为一个单词, 匹配边界包含某一特征的字符
7. 高级用法
贪婪匹配 or 懒惰匹配 ?
正则匹配的原则默认是按照贪婪匹配,表示尽可能多的匹配,也就是在满足条件的情况下,找到最长的。
<span> <div>this is very important!</div> </span>
我们要匹配所有的html标签 我们用 <.+>
,结果发现匹配的并不是 按照 <span>
和 <div>
而是把所有的都返回了,原因就是默认采用了贪婪匹配。
如果我们用<.+?>
表示我们用懒惰匹配,只要找到符合的就作为一个返回结果。
懒惰模式存在时对可匹配多个字符的操作符 例如
贪婪元字符 | 懒惰元字符 |
---|---|
+ | +? |
* | *? |
{} | {}? |
修饰符
/i
ignore - 不区分大小写 将匹配设置为不区分大小写,搜索时不区分大小写: A 和 a 没有区别。
/g
g global - 全局匹配 查找所有的匹配项。
/m
m multi line - 多行匹配 使边界字符 ^ 和 $ 匹配每一行的开头和结尾,记住是多行,而不是整个字符串的开头和结尾。
/s
特殊字符圆点. 中包含换行符 \n, 默认情况下的圆点 . 是匹配除换行符 \n 之外的任何字符,加上 s 修饰符之后,
. 中包含换行符 \n。
回溯引用
回溯引用指的是模式的后半部分引用在前半部分中定义的子表达式,且只能用来引用模式里的子表达式()
子表达式即用元字符(
和)
括起来的部分)。简单理解,可以将回溯引用想象成对变量的引用。
使用
\1
表示引用第1个子表达式,\2
表示引用第2个子表达式,以此类推(通常,回溯引用从1
开始匹配)
注意
由于子表达式是按照其在表达式中的相对位置来引用的,因此有个不好之处在于,一旦改变了子表达式的相对位置,很容易引起正则的回溯引用失效。
例子:
我们要匹配一个HTML标签 <h1>-<h6>
中的内容,我们用这样的正则<[Hh][1-6]>.*?</[Hh][1-6]>
,这个可以匹配但是没有办法判断标签错误匹配的问题。
可以用回溯解决,主要时判断<h>
标签前面的数字是否匹配, <[hH]([1-6])>.*?</[hH]\1>
就可以解决。
替换操作符 $
$1
、$2
表达的是正则表达式中小括号(即分组)中的内容,$1
是第一个小括号(分组)中的匹配结果,$2
是第二个小括号(分组)中的匹配结果,以此类推。通常$1
、$2
用在替换操作中。如下:
前后查找
前后查找是查找具有某一条件的字符串
(正)向前查找 (?=)
如果我们想在一堆 URL 中拿到它们的协议名(scheme
)
http://www.test.com
https://www.example.com
ftp://ftp.aaa.com
我们可能会使用.+:
来完成要求,但是该模式匹配的是 http:,https:,ftp:
,要提取协议名我们还得对字符串做二次处理。所幸的是,使用向前查找.+(?=:)
就能够省去后面的冒号,其中子表达式(?=:)
表示找到:
就可以了,不把它包括在最终的匹配结果里。
(正)向后查找 (?<=)
除了?=
表示向前查找,还有很多正则表达式(JS不在其中。。。)也支持向后查找,操作符为 ?<=
。同样地,来看一个例子:对于如下文本
ABC01: $23.45
HGG43: $5.31
如果我们想将其中的价格匹配出来(不含$
),使用 [0-9.]+
是不行的,因为它也会匹配出 01
和 43
,这时候使用向后查找 (?<=\$)[0-9.]+
问题就迎刃而解了。
前后取非查找 (负向查找) (?!)
(?<!)
如果文本中我们只想匹配数量而不匹配金额:只匹配num
不匹配 $num
,比如下面这个例子
I paid $30 for 100 apples,
50 orange, and 60 pears,
I saved $5 on this order.
\b(?<!\$)\d+\b
最终的匹配的结果是只包含那些不以 $
开头的数值。
这个是所有操作符的总结
这时候可以取非
操作符 | 说明 |
---|---|
(?=) | 正向前查找 |
(?<=) | 正向前查找 |
(?!) | 负向前查找 |
(?<!) | 负向后查找 |
嵌入条件
北美的电话号码格式是 (123)456-7890
和 123-456-7890
,要匹配该模式,可能很容易就想到使用 \(?\d{3}\)?-?\d{3}-\d{4}
,但是该表达式也会匹配到非法的数据格式比如 (123-456-7890
,这种情况我们就需要使用条件:如果电话号码里有一个 (
,则第五个字符匹配 )
,否则匹配 -
。
嵌入条件的语法为:
(?(backreference)true-regex)
(?(backreference)true-regex|false-regex)
可以理解为:
if (backreference) { true-regex } else { false-regex }
分析这个模式,其中 (\()?
匹配一个可选的左括号,(?(1)\)|-)
是一个回溯引用条件,只有配对出现的括号才会被匹配。
相关文章:

正则表达式学习和高级用法
以下所有的验证都在 在线验证 1. 起始符 / 正则表达式的起始符2. 限定符 匹配前面的子表达式**1次或多次**。例如,zo 能匹配 "zo" 以及"zoo",但不能匹配 "z"。等价于 {1,}。 ? 匹配前面的子表达式**0次或1次**。例如…...

C# Onnx Yolov8 Fire Detect 火焰识别,火灾检测
效果 项目 代码 using Microsoft.ML.OnnxRuntime.Tensors; using Microsoft.ML.OnnxRuntime; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using Syste…...

线程安全问题
目录 一、线程安全 二、线程安全问题 三、线程安全 1.同步代码块 2.同步方法 3.Lock锁 3.1常用方法: 3.2 死锁 3.3 练习: 四、生产者和消费者(线程通信问题) 一、线程安全 如果有多个线程在同时运行,而这些…...

【力扣每日一题】2023.9.18 打家劫舍Ⅲ
目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 今天是打家劫舍3,明天估计就是打家劫舍4了。 今天的打家劫舍不太一样,改成二叉树了,不过规则没有变&…...

Docker基础学习
Docker 学习目标: 掌握Docker基础知识,能够理解Docker镜像与容器的概念 完成Docker安装与启动 掌握Docker镜像与容器相关命令 掌握Tomcat Nginx 等软件的常用应用的安装 掌握docker迁移与备份相关命令 能够运用Dockerfile编写创建容器的脚本 能够…...
esbuild中文文档-路径解析配置项(Path resolution - Alias、Conditions)
文章目录 路径解析配置项 Path resolution别名 Alias条件解析 Conditionsconditions是如何工作的 结语 哈喽,大家好!我是「励志前端小黑哥」,我带着最新发布的文章又来了! 老规矩,小手动起来~点赞关注不迷路࿰…...
您的应用存在隐藏最近任务列表名称的行为,不符合华为应用市场审核标准
最近各家应用市场,唯独华为审核被拒了。。理由是您的应用存在隐藏最近任务列表名称的行为,不符合华为应用市场审核标准。 根据华为给出的视频,app在任务队列(也就是俗称的安卓多任务管理后台)不显示应用名。因为我们ap…...

Spring的 webFlux 和 webMVC
看到一个测评文章,并发在300的时候webMVC 和 webFlux的处理能力不相上下, 当并发达到3000的时候, webFlux明显优于webMVC, 有图有真相, 我信了. webMVC 是 one-request-one thread 堵塞模式, flux是非阻塞模式, 是spring家族系列…...

【洛谷算法题】P5706-再分肥宅水【入门1顺序结构】
👨💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5706-再分肥宅水【入门1顺序结构】🌏题目描述🌏输入格式…...
android studio环境搭建让你的开发之旅更加简单
示例示例Android Studio环境搭建:下载并安装Android Studio:从官网下载Android Studio,然后双击安装文件,按照提示进行安装,安装完成之后,可以在桌面上找到Android Studio的快捷方式。 Android Studio环境…...

Java面试_并发编程_线程基础
Java面试_并发编程_线程基础 线程基础线程和进程的区别(出现频率: 3⭐)并行和并发的区别(出现频率: 2⭐)线程的创建(出现频率: 4⭐)线程的状态(出现频率: 4⭐)让线程按顺序执行(出现频率: 3⭐)notify()和notifyAll()有什么区别(出现频率: 2⭐)wait方法和sleep方法的区别(出现频…...

基于Java的高校实习管理系统设计与实现(亮点:实习记录、实习打分、实习作业,功能新颖、老师没见过、当场唬住!)
高校实习管理系统 一、前言二、我的优势2.1 自己的网站2.2 自己的小程序(小蔡coding)2.3 有保障的售后2.4 福利 三、开发环境与技术3.1 MySQL数据库3.2 Vue前端技术3.3 Spring Boot框架3.4 微信小程序 四、功能设计4.1 主要功能描述 五、系统主要功能5.1…...
傅里叶变换
傅里叶变换常用于缺陷检测项目,对于一些背景偏暗,对比度不明显的场景,傅里叶变换可以起到提升对比度的效果。傅里叶变换从频域角度来处理,对于一些图像像素尺寸大的图像,算法时间往往时间达到1s以上,对于一…...

Vue Grid Layout -️ 适用Vue.js的栅格布局系统,在vue3+上使用
文章目录 1、官网简介2、在vue3中使用1)、需要导入vue3支持的版本插件2)、在mian.js里引入:3)、在组件中使用 3、layout布局的计算逻辑4、 gridLayout 的属性 该栅格系统目前对 vue2 的支持是最好的,vue3 是需要用插件支持的,会在小节详细讲解…...
Electron(v26.2.1)无法加载React Developer Tools(v4.28.0)
一开始按照electron官网上的 开发者工具扩展 教程设置React Developer Tools时,重启项目后并没有按照预期成功加载React Developer Tools,而且控制台报错: Permission scripting is unknown or URL pattern is malformed.查了下原因是因为Re…...

网站降权的康复办法(详解百度SEO数据分析)
随着搜索引擎算法的不断升级,很多网站在SEO优化过程中遭遇到降权的情况。如果您的网站也遭遇到了类似的问题,不必惊慌失措。本文将为您详细介绍网站降权恢复的方法,包括百度SEO数据分析、网站收录少的5个原因、网站被降权的6个因素以及百度SE…...
非对称加密、解密原理及openssl中的RSA示例代码
一、【原理简介】非对称加密 非对称加密,也被称为公钥加密,其中使用一对相关的密钥:一个公钥和一个私钥。公钥用于加密数据,私钥用于解密数据。公钥可以公开分享,而私钥必须保密。 密钥生成: 当一个用户或设备希望使用…...

基于springboot漫画管理系统springboot001
摘 要 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代&…...

【探索C++】string类详解
(꒪ꇴ꒪ ),Hello我是祐言QAQ我的博客主页:C/C语言,数据结构,Linux基础,ARM开发板,网络编程等领域UP🌍快上🚘,一起学习,让我们成为一个强大的攻城狮࿰…...

python 第一次作业
1.使用turtle换一个五环 2.设计这样一个程序:输入一个数字 判断它是不是一个质数 使用turtle换一个五环: >>> import turtle #导入模块 >>> turtle.width(10) #设置圆圈宽度 >>> turtle.color("blue&qu…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

链式法则中 复合函数的推导路径 多变量“信息传递路径”
非常好,我们将之前关于偏导数链式法则中不能“约掉”偏导符号的问题,统一使用 二重复合函数: z f ( u ( x , y ) , v ( x , y ) ) \boxed{z f(u(x,y),\ v(x,y))} zf(u(x,y), v(x,y)) 来全面说明。我们会展示其全微分形式(偏导…...