正则表达式学习和高级用法
以下所有的验证都在
在线验证
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…...
个人博客网站一揽子:Docker建站(Nginx、Wordpress、MySql)
前言 既然安装了Docker,那就不妨建立一个自己的博客网站。实现内外网隔离网站部署,更安全。 1.创建Docker子网络 首先创建一个Docker虚拟子网: sudo docker network create wpnt检查是否建立成功: sudo docker network ls最后…...
Unity 课时 4 : No.4 模拟面试题
课时 4 : No.4 模拟面试题 C# 1. 请说明字符串中 string str null string str “” string str string.Empty 三者的区别 第一个未作初始化没有值, 第二个为空字符串, 答案: str null 在堆中没有分配内存地址 str "" 和 string.Empty 一样都是…...
Golang 基础面试题 01
Golang 面试题合集.png 背景 在之前的文章中分享了 k8s 相关的面试题,本文我们重点来讨论和 k8s 密切相关的 Go 语言面试题。 这几年随着云原生的兴起,大部分后端开发者,特别是 Java 开发者都或多或少的想学习一些 Go 相关的技能,…...
007-第一代软件需求整理
第一代软件需求整理 文章目录 第一代软件需求整理项目介绍需求来源需求来源1:竞品软件分析需求来源2:医生(市场)需求来源3:项目组内部需求来源4:软件组内部需求来源5:软件开发成员需求来源6&…...
XMLHttpRequest介绍
目录 一、介绍1.创建 XMLHttpRequest2.初始化3.发送请求4.获取响应5.响应类型 二、发送GET请求示例三、发送POST请求示例四、发送POST请求下载文件示例五、发送POST请求上传文件示例 一、介绍 1.创建 XMLHttpRequest let xhr new XMLHttpRequest();2.初始化 xhr.open(metho…...
阿里云无影云电脑和传统PC有什么区别?
阿里云无影云电脑和传统电脑PC有什么区别?区别大了,无影云电脑是云端的桌面服务,传统PC是本地的硬件计算机,无影云电脑的数据是保存在云端,本地传统PC的数据是保存在本地客户端,阿里云百科分享阿里云无影云…...
基于matlab实现的船舶横摇运动仿真程序
完整程序: clc clear syms w we; w0.4:0.05:1.6;mu90;v6;%kb1;kt1;%航速6m/s,航向90度,即横浪,cos(90)0 T3;B10;Sw0.785;%船宽10米,吃水3米,水线面系数假设为0.785 weww.^2.*v/9.8; for i1:24 delta_we(i)we(i1)-…...
Java手写二叉索引树和二叉索引树应用拓展案例
Java手写二叉索引树和二叉索引树应用拓展案例 1. 算法思维导图 以下为二叉索引树的实现原理的思维导图,使用Mermanid代码表示: #mermaid-svg-raMRIu7t3H33MKh1 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#…...
大数据知识点之大数据5V特征
大数据的特征可以浓缩为五个英文单词,Volume(大量)、Variety(多样性)、Velocity(速度)、Value(价值)、Veracity(准确性)。因为是5个特征都是以“V”开头的英文单词,又叫大数据5V特征。 概述&…...
Java的Socket通信的断网重连的正确写法
Java的Socket通信的断网重连的正确写法 Socket通信的断网重连介绍客户端与服务端源码演示截图本地演示服务器演示演示截图 总结 Socket通信的断网重连介绍 针对于已经建立通信的客户端与服务器,当客户端与服务器因为网络问题导致网络不通而断开连接了或者由于服务器…...
网站优化qq群/全国新冠疫情最新情况
掌握一定的英语知识,具有一定的英语水平是学习每一个专业都必备的学习计算机专业的话,并不会对英语水平作出特别的要求,因此不存在计算机专业对英语水平要求较高的这种担心,基本的英语术语掌握了就可以了。计算机专业的学习&#…...
中江县规划和建设局网站/爱站网seo综合查询
windows下OS时间和主板CMOS芯片里的时间通常是一致的,但是linux却不一定,在无法联网自动校准时间的情况下,只能手动调整: 查看系统时间 date 调整系统时间 sudo date -s 01:01:01 //仅设置时间,不修改日期sudo date -s…...
昆明网站排名优化公司/廊坊seo关键词优化
6.引用 1.什么是引用? 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。 **类型& 引用变量名(对象名) 引用实体;**void TestRef(…...
没有自己的网站做百度竞价/怎么优化标题和关键词排名
右键要查询的文件 -- team -- show local history 显示 修改历史窗口 选择修改历史中一条记录 -- 右键 --Compare current with local 显示文件对比 转载于:https://www.cnblogs.com/caer/p/5729011.html...
乐山网站建设/百度竞价平台官网
1,导入原Eclipse Web项目 由于使用 PowerDesign连接MySql时只能用32位 Jdk,原Eclipse项目依赖于64位Jdk,导致在eclipse打不开工程,把工程导入IDEA后,选择Tomcat Server-Local,点击上面""菜单&…...