30分钟学会正则表达式

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

作用
  • 匹配 查看一个字符串是否符合正则表达式的语法

  • 搜索 正则表达式来提取字符串中符合要求的文本

  • 替换 查找字符串中符合正则表达式的文本,并用相应的字符串替换

  • 分割 使用正则表达式对字符串进行分割。

案例

原始内容:姓名:lilei手机号:13888888888邮箱:lilei@qq.com匹配正则:姓名:(\w+)\n手机号:(1[3-9]\d{9})\n邮箱:([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)

无需对正则表达式心怀恐惧,接下来将逐步为您阐释,待阅读完毕,您定会茅塞顿开。

字符类

字符类是匹配一个或多个的字符

在上面的例子中:

姓名:(\w+)\n手机号:(1[3-9]\d{9})\n邮箱:([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)

标记的都是字符类,下面是字符类的一些说明

1. . 匹配除 "\n" 之外的任何单个字符。要匹配	包括 '\n'在内的任何字符,请使用 '[.\n]' 的模式。
2. \d 匹配一个数字字符。等价于 [0-9]。
3. \D 匹配一个非数字字符。等价于 [^0-9]。
4. \s 匹配任何空白字符,包括空格、制表符、	换页符等等。等价于[ \f\n\r\t\v]。
5. \S 匹配任何非空白字符。等价于 	[^\f\n\r\t\v]。
6. \w 匹配包括下划线的任何单词字符。等价于	'[A-Za-z0-9_]'。
7. \W 匹配任何非单词字符。等价于	 '[^A-Za-z0-9_]'。[]用法
[Pp]ython	匹配 "Python" 或 "python"
ub[ye]		匹配 "ruby" 或 "rube"
[aeiou]		匹配中括号内的任意一个字母
[0-9]	    匹配任何数字。类似于 [0123456789]
[a-z]       匹配任何小写字母
[A-Z]	    匹配任何大写字母
[a-zA-Z0-9]	匹配任何字母及数字
[^aeiou]	除了aeiou字母以外的所有字符
[^0-9]	            匹配除了数字外的字符字符类内部,
除了\之外,其他特殊字符不再具备特殊意义,都表示字面值。
^放在第一个位置表示否定,
放在其他位置表示^本身,
-放在中间表示范围,放在字符类中的第一个字符,则表示-本身。

量词

正则表达式量词是用来修饰字符类的数量

在上面的例子中:

姓名:(\w+)\n手机号:(1[3-9]\d{9})\n邮箱:([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)

这些都是修饰前一个字符类的数量,下面是量词的一些说明

1. ?	匹配前面的字符0次或1次
2. *	匹配前面的字符0次或多次
3. +	匹配前面的字符1次或者多次
4. {m}	匹配前面表达式m次
5. {m,}	匹配前面表达式至少m次
6. {,n}	匹配前面的正则表达式最多n次
7. {m,n}	匹配前面的正则表达式至少m次,最多n次注意点:以上量词都是贪婪模式,会尽可能多的匹配,如果要改为非贪婪模式,通过在量词后面跟随一个?来实现

分组与捕获

分组是用圆括号“()”括起来的正则表达式,匹配出的内容就表示一个分组。

分组和捕获在正则表达式中有着密切的联系,一般情况下,分组即捕获,都用小括号完成: 

  • (exp)    :分组,并捕获该分组匹配到的文本
  • (?:exp) :分组,但不捕获该分组匹配到的文本,可以理解为数学里小括号的作用,可以在后面使用量词或管道符

什么是捕获呢?使用小括号指定一个子表达式后,子表达式匹配的文本(即匹配的内容)可以在其他子表达式中重复使用。

简单来说就是:对需要的内容作一个标记,在搜索或替换时,可以快捷引用

在上面的例子中:

姓名:(\w+)\n手机号:(1[3-9]\d{9})\n邮箱:([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)

有三个分组,分别是分组1,分组2, 分组3, 从1开始

搜索时,可以快捷提取分组的内容

替换时,可以捕获(引用)分组内容进行替换

原始内容:姓名:lilei手机号:13888888888邮箱:lilei@qq.com
匹配正则:姓名:(\w+)\n手机号:(1[3-9]\d{9})\n邮箱:([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)
替换正则:$1的邮箱是:$3, 电话是:$2
替换后:lilei的邮箱是:lilei@qq.com, 电话是:13888888888
字符功能
(ab)将括号中正则表达式作为⼀个分组
\num 或 $num引⽤分组序号匹配到的字符串,在不同的编程语言中会不所不同
(?P<name>)分组起别名,这个不常用可以忽略
(?P=name)引⽤别名为name分组匹配到的字符串

捕获(引用)内容 

1. 通过组号捕获(引用)

  • 每一个没有使用?:的小括号都会分配一个组合,从1开始,从左到右递增,可以通过\i引用前面()内表达式捕获的内容(\i 的内容是值与前面一致,并不是表达式一致)

2.通过组名捕获(引用)

  • 可以通过在左括号后面跟随?P<name>,尖括号中放入组名来为一个组起一个别名,后面通过(?P=name)来引用 前面捕获的内容。如(?P<word>\w+)\s+(?P=word)来匹配重复的单词。(这里引用前面内容,并不是正则表达式)

    (?P<word>\w+)\s+((?P=word))如果引用的内容也需要分组,则外面再加一个括号

注意点:反向引用不能放在字符类[]中使用。

贪婪模式与非贪婪模式

贪婪模式:总是尝试匹配尽可能多的字符。

非贪婪模式,总是尝试匹配尽可能少的字符。

默认是贪婪模式, 在量词后面加上?,就变成贪婪模式

在上面的案例中,没有体现,这里单独给个案例来说明

原始字符:<div>test1</div><div>test2</div>
匹配正则:贪婪模式<div>.*</div>
结果:匹配数量:1匹配结果: <div>test1</div><div>test2</div>匹配正则:非贪婪模式<div>.*?</div>
结果:匹配数量:2匹配结果: <div>test1</div><div>test2</div>

断言

断言不会匹配任何文本,只是对断言所在的文本施加某些约束

1. \b	匹配单词的边界,放在字符类[]中则表示backspace       2. \B 匹配非单词边界,受ASCII标记影响       3. \A  指定匹配必须出现在字符串的开头(忽略Multiline选项)。 4. \Z 指定匹配必须出现在字符串的结尾或字符串结尾的\ n之前(忽略Multiline选项)。   5. ^	在起始处匹配,如果有MULTILINE标志,则在每个换行符后匹配          6. $	在结尾处匹配,如果有MULTILINE标志,则在每个换行符前匹配   零宽断言7. (?=exp)	也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp。   8. (?<=exp)	也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp。负向零宽断言9. (?!e)	零宽度负预测先行断言(?!exp),断言此位置的后面不能匹配表达式exp。      10.(?<!e)	零宽度负回顾后发断言来断言此位置的前面不能匹配表达式exp:

这里以^和$来说明,^和$分别代表的是起始位置和结束位置,不会匹配任务字符

验证用户名格式
假设要求用户名只能由字母开头,后面可以跟字母、数字或下划线,且长度在 3 到 16 位之间。
正则表达式:^[a-zA-Z][a-zA-Z0-9_]{2,15}$
解释:
^ 表示匹配字符串的开头,确保用户名是以字母开头。
[a-zA-Z] 匹配单个字母(大写或小写)。
[a-zA-Z0-9_]{2,15} 表示后面可以跟 2 到 15 个字母、数字或下划线。
$ 表示匹配字符串的结尾,确保整个用户名符合规定的长度和字符组成。(?=exp) 和(?<=exp)的案例
提取文件名中的编号(文件命名有一定规则):
假设文件命名格式为 “文件_编号.txt”,如 “报告_001.txt”,我们想提取编号部分。
可以使用正则表达式(?<=\_)[0-9]{3}(?=\.txt)。
解释:(?<=\_)是正向肯定回顾,表示在当前位置之前(但不包括当前位置)必须有一个 “_” 字符。[0-9]{3}匹配 3 个数字,(?=\.txt)是正向肯定预查,表示在当前位置之后(但不包括当前位置)必须有一个 “.txt”。

修饰符(标记)

标记也称为修饰符,正则表达式的标记用于指定额外的匹配策略。

标记不写在正则表达式里,标记位于表达式之外。

修饰符含义描述
iignore - 不区分大小写将匹配设置为不区分大小写,搜索时不区分大小写: A 和 a 没有区别。
gglobal - 全局匹配查找所有的匹配项。
mmulti line - 多行匹配使边界字符 ^ 和 $ 匹配每一行的开头和结尾,记住是多行,而不是整个字符串的开头和结尾。
s特殊字符圆点 . 中包含换行符 \n默认情况下的圆点 . 是匹配除换行符 \n 之外的任何字符,加上 s 修饰符之后, . 中包含换行符 \n。

在vscode中使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/62581.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电子应用设计方案-33:智能AI投影仪系统方案设计

智能 AI 投影仪系统方案设计 一、引言 随着科技的不断进步&#xff0c;投影仪在家庭娱乐、商务办公和教育培训等领域的应用越来越广泛。智能 AI 投影仪作为一种创新的投影设备&#xff0c;结合了人工智能技术&#xff0c;为用户带来更便捷、智能和个性化的使用体验。 二、系统…

【微服务】SpringBoot 对接飞书多维表格事件回调监听流程详解

目录 一、前言 二、前置准备 2.1 创建一个应用 2.2 准备一张测试使用的多维表 2.3 获取对接文档 2.4 工程中添加SDK 三、对接过程 3.1 配置Encrypt Key 和 Verification Token 3.2 配置订阅方式 3.3 添加事件 3.4 申请权限 3.5 编写订阅代码 3.6 订阅文档事件 3.7…

SpringBoot 项目中使用 spring-boot-starter-amqp 依赖实现 RabbitMQ

文章目录 前言1、application.yml2、RabbitMqConfig3、MqMessage4、MqMessageItem5、DirectMode6、StateConsumer&#xff1a;消费者7、InfoConsumer&#xff1a;消费者 前言 本文是工作之余的随手记&#xff0c;记录在工作期间使用 RabbitMQ 的笔记。 1、application.yml 使…

【优选算法篇】两队接力跑:双指针协作解题的艺术(下篇)

文章目录 须知 &#x1f4ac; 欢迎讨论&#xff1a;如果你在学习过程中有任何问题或想法&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习。你的支持是我继续创作的动力&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;觉得这篇文章对你有帮助吗&#xff1…

ElasticSearch的学习

介绍 ElasticSearch&#xff08;简称ES&#xff09;是一个开源的分布式搜索和数据分析引擎&#xff0c;是用Java开发并且是当前最流行的开源的企业级搜索引擎&#xff0c;能够达到近实时搜索&#xff0c;它专门设计用于处理大规模的文本数据和实现高性能的全文检索。 Elastic…

Y20030018基于Java+Springboot+mysql+jsp+layui的家政服务系统的设计与实现 源代码 文档

家政服务系统的设计与实现 1.摘要2.开发目的和意义3.系统功能设计4.系统界面截图5.源码获取 1.摘要 随着人们生活水平的提高&#xff0c;老龄化、少子化等多重因素影响&#xff0c;我国对家政服务人群的需求与日俱增。家政服务行业对我国的就业和社会效益贡献也与日俱增&#…

南京仁品耳鼻喉专科医院:12月启动公益义诊月

专业医疗资源送至“家门口”&#xff01;南京仁品耳鼻喉专科医院启动公益义诊月 随着2024年即将步入尾声&#xff0c;南京仁品耳鼻喉医院为回馈社会&#xff0c;提升公众健康福祉&#xff0c;将于12月隆重推出“三甲专家公益义诊月”活动。此次活动旨在通过汇聚众多耳鼻喉领域…

ospf协议(动态路由协议)

ospf基本概念 定义 OSPF 是典型的链路状态路由协议&#xff0c;是目前业内使用非常广泛的 IGP 协议之一。 目前针对 IPv4 协议使用的是 OSPF Version 2 &#xff08; RFC2328 &#xff09;&#xff1b;针对 IPv6 协议使用 OSPF Version 3 &#xff08; RFC2740 &#xff09;。…

Linux - nfs服务器

五、nfs服务器 1、基础 NFS服务器可以让PC将网络中的NFS服务器共享的目录挂载到本地端的文件系统中&#xff0c;而在本地端的系统 中看来&#xff0c;那个远程主机的目录就好像是自己的一个磁盘分区一样。 由于NFS支持的功能比较多&#xff0c;而不同的功能都会使用不同的程…

现代网络架构PCI DSS合规范围确定和网络分割措施实施探讨

本文为atsec和作者技术共享类文章&#xff0c;旨在共同探讨信息安全业界的相关话题。未经许可&#xff0c;任何单位及个人不得以任何方式或理由对本文的任何内容进行修改。转载请注明&#xff1a;atsec信息安全和作者名称 1 引言 支付卡行业数据安全标准 &#xff08;P…

第二讲:C++基础语法与程序结构

课程目标&#xff1a; 使学生掌握C的基本语法规则。教授学生如何编写简单的C程序&#xff0c;并理解程序的基本结构。通过实践&#xff0c;加深学生对C编程的理解和兴趣。 课程内容&#xff1a; 一、引言 回顾上一讲关于C的概述&#xff0c;强调学习基础语法的重要性。简要…

鸿蒙开发:自定义一个任意位置弹出的Dialog

前言 鸿蒙开发中&#xff0c;一直有个问题困扰着自己&#xff0c;想必也困扰着大多数开发者&#xff0c;那就是&#xff0c;系统提供的dialog自定义弹窗&#xff0c;无法实现在任意位置进行弹出&#xff0c;仅限于CustomDialog和Component struct的成员变量&#xff0c;这就导致…

深入浅出:开发者如何快速上手Web3生态系统

Web3作为互联网的未来发展方向&#xff0c;正在逐步改变传统互联网架构&#xff0c;推动去中心化技术的发展。对于开发者而言&#xff0c;Web3代表着一个充满机遇与挑战的新领域&#xff0c;学习和掌握Web3的基本技术和工具&#xff0c;将为未来的项目开发提供强大的支持。那么…

Q-2A型金相试样切割机

产品概述 在金相试样制备过程中&#xff0c;试样材料的切割是试样制备的首道重要工序,本机利用高速旋转的薄片砂轮来截取试样&#xff0c;适直切割较硬的金属材料&#xff0c;本机有冷却装置&#xff0c;用来带走切割时所产生的热量&#xff0c;避免试样过热而改变组织。 主要…

十二、Pod的扩缩容-手动/自动-HPA

在实际生产系统中,经常会遇到某个服务需要扩容的场景,也可能会遇到由于资源紧张或者工作负载降低而需要减少服务实例数量的场景。此时可以利用Deployment/RC的Scale机制来完成这些工作。 Kubernetes对Pod的扩缩容操作提供了手动和自动两种模式,手动模式通过运行kubectl sca…

Ubuntu环境中RocketMQ安装教程

参考教程 https://blog.csdn.net/weixin_56219549/article/details/126143231 1、安装JDK&#xff0c;并配置环境变量&#xff08;略&#xff09; 2、下载RocketMQ安装包 RocketMQ下载地址&#xff0c;选择二进制包下载 unzip rocketmq-all-5.0.0-ALPHA-bin-release.zip 使…

传输控制协议(TCP)

传输控制协议是Internet一个重要的传输层协议。TCP提供面向连接、可靠、有序、字节流传输服务。 1、TCP报文段结构 注&#xff1a;TCP默认采用累积确认机制。 2、三次握手、四次挥手 &#xff08;1&#xff09;当客户向服务器发送完最后一个数据段后&#xff0c;发送一个FIN段…

我们来学mysql -- 事务之概念(原理篇)

事务的概念 题记一个例子一致性隔离性原子性持久性 题记 在漫长的编程岁月中&#xff0c;存在一如既往地贯穿着工作&#xff0c;面试的概念这类知识点&#xff0c;事不关己当然高高挂起&#xff0c;精准踩坑时那心情也的却是日了&#x1f436;请原谅我的粗俗&#xff0c;遇到B…

2024 ccpc 辽宁省赛 E(构造 思维?)L(二分+一点点数论知识?)

E 题意&#xff1a; 可以注意到&#xff1a; 我的两种方格都四个方格的大小。 所以 如果存在一种摆放方式 那么 4|nm。 再考虑一种特殊的情况 22 &#xff0c;此时虽然我的积是4 但是无法摆放的。 1>对于 4 | n,或者 4 | m.我直接摆放第二种方格就可以了。 如果我n 是4 的…

自定义类型: 结构体、枚举 、联合

目录 结构体 结构体类型的声明 匿名结构体 结构的自引用 结构体变量的定义和初始化 结构体成员变量的访问 结构体内存对齐 结构体传参 位段 位段类型的声明 位段的内存分配 位段的跨平台问题 位段的应用 枚举 枚举类型的定义 枚举的优点 联合体(共用体) 联合…