正则表达式(Regular Expression,简称 Regex)
一、5w2h(七问法)分析正则表达式
是的,5W2H 完全可以应用于研究 正则表达式(Regular Expressions)。通过回答 5W2H 的七个问题,我们可以全面理解正则表达式的定义、用途、使用方法、适用场景等,帮助我们更好地学习和掌握它。
1. What(什么是正则表达式?)
- 正则表达式是一种用于描述字符串模式的语法规则。它通过一些特殊的字符和符号来定义匹配文本的模式,广泛应用于文本搜索、替换、验证等操作中。正则表达式能够匹配符合特定规则的字符串。
例如:
\d:匹配任何数字字符。^abc:匹配以"abc"开头的字符串。\w+:匹配一个或多个字母、数字或下划线。
2. Why(为什么要使用正则表达式?)
- 正则表达式通过其简洁的语法提供了一种强大的工具,可以在文本中进行复杂的模式匹配,减少繁琐的文本处理代码,提升开发效率。
- 用途:
-
- 验证输入:比如验证电子邮件地址、电话号码等格式。
- 查找和替换:在文本中查找符合某个模式的字符串并替换。
- 文本提取:从文本中提取符合特定模式的信息。
3. When(何时使用正则表达式?)
- 当你需要处理或验证字符串的格式时,尤其是在文本搜索、数据清洗、日志分析等场景下,正则表达式非常有用。
- 常见场景:
-
- 验证用户输入(如邮箱、日期格式等)。
- 提取特定格式的数据(如从网页抓取邮箱地址、电话号码等)。
- 文本搜索和替换(如在代码中查找函数定义或在文件中查找特定信息)。
4. Where(在哪里使用正则表达式?)
- 正则表达式可以在许多编程语言和工具中使用,几乎所有现代编程语言都支持正则表达式(如 Java, Python, JavaScript, C# 等)。
- 应用场景:
-
- 编程语言:在 Python 中使用
re模块,在 JavaScript 中使用RegExp对象,在 Java 中使用Pattern类等。 - 文本编辑器:许多文本编辑器(如 VS Code、Sublime Text)支持正则表达式来进行查找和替换。
- 命令行工具:如
grep,sed,awk等 Unix 工具支持正则表达式。
- 编程语言:在 Python 中使用
5. Who(谁使用正则表达式?)
- 程序员:正则表达式是开发人员必备的工具,特别是涉及文本处理、数据清理、日志分析等任务时。
- 测试人员:在自动化测试中,正则表达式可用于验证字符串的格式或从响应中提取信息。
- 数据分析师:用于清洗和提取结构化或非结构化数据中的有用信息。
6. How(如何使用正则表达式?)
- 正则表达式的语法通常包括常用的特殊字符和元字符,如:
-
.:匹配任意单个字符。*:匹配前面的字符零次或多次。+:匹配前面的字符一次或多次。[]:定义字符集,匹配其中的任意一个字符。|:表示"或"操作,匹配左边或右边的表达式。():分组,用来定义子表达式或捕获匹配。
- 使用方法:
-
- 在编程中,通常使用正则表达式的相关API进行匹配和操作。例如,在 Python 中:
import re
pattern = r'\d+' # 匹配一个或多个数字
result = re.findall(pattern, 'There are 123 apples and 456 oranges.')
print(result) # 输出:['123', '456']
7. How much(多少?)
- 正则表达式本身是一个计算机程序语言的工具,它没有直接的“成本”,但它的复杂度和匹配的文本量可能会影响性能。尤其是在大型文本处理时,正则表达式的效率和匹配速度可能会成为问题。
- 性能问题:
-
- 对于非常复杂的正则表达式,或者需要匹配大量文本的操作,可能会导致性能问题。因此在使用正则表达式时,需要谨慎设计,以避免过度复杂的匹配模式和低效的匹配操作。
总结:
通过使用 5W2H 方法来分析 正则表达式,可以帮助我们全面了解它的定义、目的、应用场景以及如何高效地使用它。在实际工作中,正则表达式是一个强大的工具,特别是在需要处理和分析字符串时,通过结构化思维,可以帮助我们更好地理解正则表达式的使用方式和最佳实践。
二、正则表达式-菜鸟教程-整理

非打印字符
非打印字符也可以是正则表达式的组成部分。下表列出了表示非打印字符的转义序列:
| 字符 | 描述 |
|---|---|
| \cx | 匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。 |
| \f | 匹配一个换页符。等价于 \x0c 和 \cL。 |
| \n | 匹配一个换行符。等价于 \x0a 和 \cJ。 |
| \r | 匹配一个回车符。等价于 \x0d 和 \cM。 |
| \s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。注意 Unicode 正则表达式会匹配全角空格符。 |
| \S | 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 |
| \t | 匹配一个制表符。等价于 \x09 和 \cI。 |
| \v | 匹配一个垂直制表符。等价于 \x0b 和 \cK。 |
特殊字符
所谓特殊字符,就是一些有特殊含义的字符,如上面说的 runoo*b 中的 *,简单的说就是表示任何字符串的意思。如果要查找字符串中的 * 符号,则需要对 * 进行转义,即在其前加一个 \,runo\*ob 匹配字符串 runo*ob。
许多元字符要求在试图匹配它们时特别对待。若要匹配这些特殊字符,必须首先使字符"转义",即,将反斜杠字符\ 放在它们前面。下表列出了正则表达式中的特殊字符:
| 特别字符 | 描述 |
|---|---|
| $ | 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,请使用 \$。 |
| ( ) | 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \)。 |
| * | 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。 |
| + | 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。 |
| . | 匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 \. 。 |
| [ | 标记一个中括号表达式的开始。要匹配 [,请使用 \[。 |
| ? | 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。 |
| \ | 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\\' 匹配 "\",而 '\(' 则匹配 "("。 |
| ^ | 匹配输入字符串的开始位置,除非在方括号表达式中使用,当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合。要匹配 ^ 字符本身,请使用 \^。 |
| { | 标记限定符表达式的开始。要匹配 {,请使用 \{。 |
| | | 指明两项之间的一个选择。要匹配 |,请使用 \|。 |
限定符
限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有 * 或 + 或 ? 或 {n} 或 {n,} 或 {n,m} 共6种。
正则表达式的限定符有:
| 字符 | 描述 | 实例 |
|---|---|---|
| * | 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于 {0,}。 | 尝试一下 » |
| + | 匹配前面的子表达式一次或多次。例如,zo+ 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。 | 尝试一下 » |
| ? | 匹配前面的子表达式零次或一次。例如,do(es)? 可以匹配 "do" 、 "does"、 "doxy" 中的 "do" 和 "does"。? 等价于 {0,1}。 ![]() | 尝试一下 » |
| {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?。请注意在逗号和两个数之间不能有空格。 |
* 和 + 限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个 ? 就可以实现非贪婪或最小匹配。
例如,您可能搜索 HTML 文档,以查找在 h1 标签内的内容。HTML 代码如下:
<h1>RUNOOB-菜鸟教程</h1>
贪婪:下面的表达式匹配从开始小于符号 (<) 到关闭 h1 标记的大于符号 (>) 之间的所有内容。
/<.*>/

非贪婪:如果您只需要匹配开始和结束 h1 标签,下面的非贪婪表达式只匹配 <h1>。
/<.*?>/

也可以使用以下正则表达式来匹配 h1 标签,表达式则是:
/<\w+?>/

通过在 *、+ 或 ? 限定符之后放置 ?,该表达式从"贪婪"表达式转换为"非贪婪"表达式或者最小匹配。
以下列出 ?=、?<=、?!、?<! 的使用区别
exp1(?=exp2):查找 exp2 前面的 exp1。

(?<=exp2)exp1:查找 exp2 后面的 exp1。

exp1(?!exp2):查找后面不是 exp2 的 exp1。

(?<!exp2)exp1:查找前面不是 exp2 的 exp1。




三、如何分析正则表达式-案例
你提供的正则表达式 ^[0-9]{1,}\.([^。|\r]*)[。|\r] 用于匹配以数字开头、后跟句点(.),并以句号(。)或换行符(\r)结尾的字符串。以下是对该正则表达式的详细解析:
1. 正则表达式解析
^[0-9]{1,}\.([^。|\r]*)[。|\r]
各部分含义:
^: 匹配字符串的开头。[0-9]{1,}:
-
[0-9]: 匹配任意一个数字(0到9)。{1,}: 表示前面的模式(数字)至少出现1次,可以出现多次。- 整体含义:匹配一个或多个数字。
\.: 匹配一个句点(.)。由于句点在正则表达式中有特殊含义(匹配任意字符),因此需要用反斜杠(\)进行转义。([^。|\r]*):
-
[^。|\r]: 匹配不是句号(。)或换行符(\r)的任意字符。*: 表示前面的模式(非句号或换行符)可以出现0次或多次。- 整体含义:匹配一段不包含句号或换行符的文本,并将其捕获为一个分组。
[。|\r]: 匹配一个句号(。)或换行符(\r),表示字符串的结束。
2. 匹配示例
假设有以下文本:
1.这是一个测试。
2.这是另一个测试
3.这是第三个测试。
匹配结果:
1.这是一个测试。:
-
- 匹配内容:
1.这是一个测试。 - 捕获的分组:
这是一个测试
- 匹配内容:
2.这是另一个测试:
-
- 匹配内容:
2.这是另一个测试 - 捕获的分组:
这是另一个测试
- 匹配内容:
3.这是第三个测试。:
-
- 匹配内容:
3.这是第三个测试。 - 捕获的分组:
这是第三个测试
- 匹配内容:
3. 改进建议
你的正则表达式已经可以满足基本需求,但有一些地方可以优化:
- 字符集语法:
-
[^。|\r]中的|是多余的,应该直接写成[^。\r]。- 修正后:
([^。\r]*)
- 换行符处理:
-
- 如果需要匹配多种换行符(如
\n或\r\n),可以将\r替换为\r?\n。 - 修正后:
[。\r?\n]
- 如果需要匹配多种换行符(如
改进后的正则表达式:
^[0-9]{1,}\.([^。\r]*)[。\r?\n]
4. 总结
- 原始正则表达式:
^[0-9]{1,}\.([^。|\r]*)[。|\r] - 功能: 匹配以数字开头、后跟句点,并以句号或换行符结尾的字符串。
- 优化建议: 修正字符集语法,并考虑多种换行符的情况。
相关文章:
正则表达式(Regular Expression,简称 Regex)
一、5w2h(七问法)分析正则表达式 是的,5W2H 完全可以应用于研究 正则表达式(Regular Expressions)。通过回答 5W2H 的七个问题,我们可以全面理解正则表达式的定义、用途、使用方法、适用场景等,…...
Superset 问题
和nginx结合使用,如果不是配置到根路径,会比较麻烦,我试了很多种方法,也就 这个 靠谱点,不过,我最后还是选择的部署在根路径,先探索一番再说默认不能选择mysql数据库,需要安装mysql客…...
JMeter脚本录制(火狐)
录制前准备: 电脑: 1、将JMeter证书导入,(bin目录下有一个证书,需要安装这个证书到电脑中) 2、按winr,输入certmgr.msc,打开证书,点击下一步,输入JMeter证书…...
基于SpringBoot的“高校社团管理系统”的设计与实现(源码+数据库+文档+PPT)
基于SpringBoot的“高校社团管理系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 总体功能结构图 局部E-R图 系统首页页面 用户…...
Maven/Gradle的讲解
一、为什么需要构建工具? 在理解 Maven/Gradle 之前,先明确它们解决的问题: 依赖管理:项目中可能需要引入第三方库(如 Spring、JUnit 等),手动下载和管理这些库的版本非常麻烦。标准化构建流程:编译代码、运行测试、打包成 JAR/WAR 文件等步骤需要自动…...
C# Winform 入门(3)之尺寸同比例缩放
放大前 放大后 1.定义当前窗体的宽度和高度 private float x;//定义当前窗体的宽度private float y;//定义当前窗台的高度 2.接收当前窗体的尺寸大小 x this.Width;//存储原始宽度ythis.Height;//存储原始高度setTag(this);//为控件设置 Tag 属性 3.声明方法,获…...
infinityfree最新免费建站详细教程_无需备案_5G空间_无限流量_免费域名_免费SSL
一、明确目标—是否要使用 1.为什么选择InfinityFree? 对于初学者、学生或只是想尝试网站搭建的个人用户来说,InfinityFree提供了一个绝佳的免费解决方案。这个国外免费的虚拟主机服务提供: 5GB存储空间 - 足以存放个人博客、作品集或小型…...
打造高效英文单词记忆系统:基于Python的实现与分析
在当今全球化的世界中,掌握一门外语已成为必不可少的技能。对于许多学习者来说,记忆大量的英文单词是一个漫长而艰难的过程。为了提高学习效率,我们开发了一个基于Python的英文单词记忆系统。这个系统结合了数据管理、复习计划、学习统计和测试练习等多个模块,旨在为用户提…...
node_modules\deasync: Command failed.
运行:“yarn install” 时报错 PS D:\WebPro\hainan-mini-program> yarn install yarn install v1.22.19 [1/4] Resolving packages... [2/4] Fetching packages... [3/4] Linking dependencies... warning " > babel-loader8.2.2" has un…...
session临时文件包含
使用情况 if(isset($_GET[file])){$file $_GET[file];$file str_replace("php", "???", $file);$file str_replace("data", "???", $file);$file str_replace(":", "???", $file);$file str_repla…...
【新能源汽车研发测试数据深度分析:从传感器到智能决策的硬核方法论】
摘要: 本文系统性解构新能源汽车(NEV)研发测试中的数据采集、处理及分析全链条,覆盖传感器融合、大数据清洗、AI算法优化等核心技术,并引入行业顶级案例(如特斯拉Autopilot验证、宁德时代BMS算法迭代&#…...
游戏引擎学习第206天
回顾并为当天的工作定下目标 接着回顾了前一天的进展。之前我们做了一些调试功能,并且已经完成了一些基础的工作,但是还有一些功能需要继续完善。其中一个目标是能够展示实体数据,以便在开发游戏逻辑系统时,可以清晰地查看和检查…...
Zapier MCP:重塑跨应用自动化协作的技术实践
引言:数字化协作的痛点与突破 在当今多工具协同的工作环境中,开发者与办公人员常常面临数据孤岛、重复操作等效率瓶颈。Zapier推出的MCP(Model Context Protocol)协议通过标准化数据交互框架,为跨应用自动化提供了新的…...
ubuntu部署ollama+deepseek+open-webui
ubuntu部署ollamadeepseekopen-webui 全文-ubuntu部署ollamadeepseekopen-webui 大纲 Ollama部署 安装Ollama:使用命令apt install curl和curl -fsSL https://ollama.com/install.sh | sh ollama-v网络访问配置:设置环境变量OLLAMA_HOST0.0.0.0:11434&…...
蓝桥云客--破译密码
5.破译密码【算法赛】 - 蓝桥云课 问题描述 在近期举办的蓝桥杯竞赛中,诞生了一场激动人心的双人破译挑战。比赛的主办方准备了N块神秘的密码芯片,参赛队伍需要在这场智力竞赛中展示团队合作的默契与效率。每个队伍需选出一位破译者与一位传输者&#…...
量子计算与经典计算的拉锯战:一场关于计算未来的辩论
在计算科学领域,一场关于未来的激烈辩论正在上演。2025年3月,D-Wave量子公司的研究人员在《Science》杂志上发表了一项突破性成果,声称他们的量子退火处理器在几分钟内解决了一个经典超级计算机需要数百万年才能完成的复杂现实问题。这一声明…...
Java面试黄金宝典30
1. 请详细列举 30 条常用 SQL 优化方法 定义 SQL 优化是指通过对 SQL 语句、数据库表结构、索引等进行调整和改进,以提高 SQL 查询的执行效率,减少系统资源消耗,提升数据库整体性能的一系列操作。 要点 从索引运用、查询语句结构优化、数据…...
React-Diffing算法和key的作用
1.验证Diffing算法 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </he…...
【NLP 54、大模型训练相关知识】
目录 引言:大模型训练两大问题 一、并行训练 1.方式一:数据并行 DP ① 复制模型到多个GPU ② 各自计算梯度后累加,再反传更新 ③ 需要单卡就能训练整个模型(显存够大) 2.方式二:模型并行 PP ① 将模型的不同…...
cursor机器码重置
1、下载vscode插件 cursor-fake-machine-0.0.2 2、将插件拖入拓展 3、彻底将cursor账号退出 setting -> Manage -> 退出账号 4、打开cursor,ctrlshiftp ,输入fake,点击确定...
IPSG 功能协议
IPSG(IP Source Guard)即 IP 源保护,是一种基于 IP 地址和 MAC 地址绑定的安全功能,用于防止 IP 地址欺骗和非法的 IP 地址访问。以下是配置 IPSG 功能的一般步骤: 基于端口的 IPSG 配置 进入接口配置模式࿱…...
es-字段类型详解
字段类型用途示例Text全文搜索的字符串字段。json { "type": "text" }Keyword精确匹配的字符串字段。json { "type": "keyword" }Numeric数值字段(如 integer、long、float 等)。json { "type": &quo…...
音视频开发从入门到精通:编解码、流媒体协议与FFmpeg实战指南
音视频开发从入门到精通:编解码、流媒体协议与FFmpeg实战指南 音视频技术作为数字媒体领域的核心,正在成为互联网和移动应用的重要组成部分。本文将全面介绍音视频开发的学习路径,从基础概念到高级应用,从编解码原理到实战案例&a…...
《P1072 [NOIP 2009 提高组] Hankson 的趣味题》
题目描述 Hanks 博士是 BT(Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫 Hankson。现在,刚刚放学回家的 Hankson 正在思考一个有趣的问题。 今天在课堂上,老师讲解了如何求两个正整数 c1 和 c2 的最大公约数…...
CSS3学习教程,从入门到精通, 化妆品网站 HTML5 + CSS3 完整项目(26)
化妆品网站 HTML5 CSS3 完整项目 下面是一个完整的化妆品网站项目,包含主页、登录页面和注册页面。我将按照您的要求提供详细的代码和注释。 1. 网站规划与需求分析 需求分析 展示化妆品产品信息提供用户注册和登录功能响应式设计,适配不同设备美观…...
全国产FMC子卡-16bit 8通道2.4G
国产化FMC DA子卡,16bit 8通道2.4GS/s 全国产FMC子卡是一款高分辨率、高采样率的全国产多通道标准双宽DAC FMC子板。其接口电气和结构设计均依据FMC标准(ANSI/VITA 57.1),通过两个高密度FMC连接器(HPC)连接至FPGA载板。它提供8路A…...
fpga:分秒计时器
任务目标 分秒计数器核心功能:实现从00:00到59:59的循环计数,通过四个七段数码管显示分钟和秒。 复位功能:支持硬件复位,将计数器归零并显示00:00。 启动/暂停控制:通过按键控制计时的启动和暂停。 消抖处理&#…...
小白 thingsboard 拆分前后端分离
1、modules 里注释掉ui_ugx <modules><module>netty-mqtt</module><module>common</module><module>rule-engine</module><module>dao</module><module>edqs</module><module>transport</module&g…...
4G专网:企业数字化转型的关键通信基石
4G专网 在数字化转型的浪潮下,企业对高可靠性、低时延、安全可控的通信网络需求日益增长。传统的公用蜂窝网络难以满足企业在工业自动化、能源管理、智慧城市等领域的特殊需求,因此4G专网成为众多行业的优先选择。作为行业领先的移动核心网提供商&#x…...
golang 的encoding/json包
理解 Go 语言中的 encoding/json 包 Go 语言通过 encoding/json 包提供了对 JSON 数据的强大支持,包括序列化、反序列化、自定义处理、数组处理、任意结构解析以及流式处理等。 1. 基本使用 1.1 结构体字段与 JSON 的映射 在 Go 中,结构体的字段可以…...

