正则表达式(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 工具支持正则表达式。

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]
各部分含义:
  1. ^: 匹配字符串的开头。
  2. [0-9]{1,}:
    • [0-9]: 匹配任意一个数字(0到9)。
    • {1,}: 表示前面的模式(数字)至少出现1次,可以出现多次。
    • 整体含义:匹配一个或多个数字。
  1. \.: 匹配一个句点(.)。由于句点在正则表达式中有特殊含义(匹配任意字符),因此需要用反斜杠(\)进行转义。
  2. ([^。|\r]*):
    • [^。|\r]: 匹配不是句号()或换行符(\r)的任意字符。
    • *: 表示前面的模式(非句号或换行符)可以出现0次或多次。
    • 整体含义:匹配一段不包含句号或换行符的文本,并将其捕获为一个分组。
  1. [。|\r]: 匹配一个句号()或换行符(\r),表示字符串的结束。

2. 匹配示例

假设有以下文本:

1.这是一个测试。
2.这是另一个测试
3.这是第三个测试。
匹配结果:
  1. 1.这是一个测试。:
    • 匹配内容:1.这是一个测试。
    • 捕获的分组:这是一个测试
  1. 2.这是另一个测试:
    • 匹配内容:2.这是另一个测试
    • 捕获的分组:这是另一个测试
  1. 3.这是第三个测试。:
    • 匹配内容:3.这是第三个测试。
    • 捕获的分组:这是第三个测试

3. 改进建议

你的正则表达式已经可以满足基本需求,但有一些地方可以优化:

  1. 字符集语法:
    • [^。|\r] 中的 | 是多余的,应该直接写成 [^。\r]
    • 修正后:([^。\r]*)
  1. 换行符处理:
    • 如果需要匹配多种换行符(如 \n\r\n),可以将 \r 替换为 \r?\n
    • 修正后:[。\r?\n]
改进后的正则表达式:
^[0-9]{1,}\.([^。\r]*)[。\r?\n]

4. 总结

  • 原始正则表达式: ^[0-9]{1,}\.([^。|\r]*)[。|\r]
  • 功能: 匹配以数字开头、后跟句点,并以句号或换行符结尾的字符串。
  • 优化建议: 修正字符集语法,并考虑多种换行符的情况。

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

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

相关文章

爬虫获取1688关键字搜索接口的实战指南

在当今电商行业竞争激烈的环境下&#xff0c;数据的重要性不言而喻。1688作为国内领先的B2B电商平台&#xff0c;拥有海量的商品信息&#xff0c;这些数据对于商家的市场分析、选品决策、价格策略制定等都有着重要的价值。本文将详细介绍如何通过爬虫技术获取1688关键字搜索接口…

如何快速解决django存储session变量时出现的django.db.utils.DatabaseError错误

我们在学习django进行web编程的时候&#xff0c;有时需要将一些全局变量信息存储在session中&#xff0c;但使用过程中&#xff0c;却发现会引起数据库的报错。通过查看django源码信息&#xff0c;发现其对session信息进行了ORM映射&#xff0c;如果数据库中不存在对应的表信息…

C语言复习--assert断言

assert.h 头⽂件定义了宏 assert() &#xff0c;⽤于在运⾏时确保程序符合指定条件&#xff0c;如果不符合&#xff0c;就报错终止运行。这个宏常常被称为“断⾔”。 assert(p ! NULL); 代码在程序运⾏到这⼀⾏语句时&#xff0c;验证变量 p 是否等于 NULL 。如果确实不等于 NU…

STL新增内容

文章目录 C11 中的 STL 新增内容容器算法 C14 中的 STL 新增内容容器算法 C17 中的 STL 新增内容容器算法 C20 中的 STL 新增内容容器算法 C11 中的 STL 新增内容 容器 std::array&#xff1a;这是一个固定大小的数组容器&#xff0c;和原生数组类似&#xff0c;但具备更好的…

C#测试Excel开源组件ExcelDataReader

使用微软的com组件Microsoft.office.Interop.Excel读写Excel文件虽然可用&#xff0c;但是列多、行多的时候速度很慢&#xff0c;之前测试过Sylvan.Data.Excel包的用法&#xff0c;如果只是读取Excel文件内容的话&#xff0c;还可以使用ExcelDataReader包&#xff0c;后者是C#开…

位置编码汇总 # 持续更新

看了那么多还没有讲特别好的&#xff0c;GPT老师讲的不错关于三角函数编码。 一、 手撕transformer常用三角位置编码 GPT说&#xff1a;“低维度的编码&#xff08;例如&#xff0c;第一个维度&#xff09;可以捕捉到大的位置差异&#xff0c;而高维度的编码则可以捕捉到小的细…

Java 模块系统深度解析

Java 模块系统深度解析 Java 模块系统&#xff08;Java Platform Module System, JPMS&#xff09;是 Java 9 引入的一项重要特性&#xff0c;它从根本上改变了 Java 应用程序的打包和依赖管理方式。本文将全面介绍 Java 模块系统的核心概念、优势及实际应用。 一、为什么需要…

蓝桥杯杯赛-日期模拟

知识点 处理日期 1. 按天枚举日期&#xff1a;逐天遍历起始日期到结束日期范围内的每个日期。 2. 处理闰年&#xff1a;正确判断闰年条件。闰年定义为&#xff1a;年份 满足以下任意一个条件&#xff1a;(闰年的2月只有29天) 满足下面一个条件就是闰年 1> 是 400 的倍数…

.Net中对称加密的实现

常见对称加密算法及优缺点 1. DES&#xff08;Data Encryption Standard&#xff09; 优点&#xff1a;是最早被广泛应用的加密算法&#xff0c;算法公开&#xff0c;实现简单&#xff0c;效率较高。缺点&#xff1a;密钥长度较短&#xff08;56 位&#xff09;&#xff0c;在…

SQLMesh调度系统深度解析:内置调度与Airflow集成实践

本文系统解析SQLMesh的两种核心调度方案&#xff1a;内置调度器与Apache Airflow集成。通过对比两者的适用场景、架构设计和操作流程&#xff0c;为企业构建可靠的数据分析流水线提供技术参考。重点内容包括&#xff1a; 内置调度器的轻量级部署与性能优化策略Airflow集成的端到…

centos线程数查看

查看当前最大支持的线程数 cat /proc/sys/kernel/threads-max当前用户进程可以创建的最大线程数&#xff08;包括子进程&#xff09; [rootlocalhost tmp]# ulimit -u得到当前实际的线程数 [rootlocalhost tmp]# ps -eLf | wc -l统计每个进程的总线程数前20的数据 [rootloc…

【大模型】视觉语言模型:Qwen2.5-VL的使用

官方github地址&#xff1a;https://github.com/QwenLM/Qwen2.5-VL 目录 Qwen家族的最新成员&#xff1a;Qwen2.5-VL 主要增强功能 模型架构更新 快速开始 使用Transformers聊天 Docker Qwen家族的最新成员&#xff1a;Qwen2.5-VL 主要增强功能 强大的文档解析功能&am…

HDMI接口设计

1. HDMI简介 HDMI(High Definition Multimedia Interface)高清多媒体接口,是首个支持在单线缆上传输,不经过压缩的全数字高清晰度、多声道音频和智能格式与控制命令数据的数字接口。这个接口可以同时传输视频信号、音频信号和控制信号。 从上图里面可以看到HDMI有3组数据信号…

C/C++ JSON 库综合对比及应用案例(六)

第六部分&#xff1a;C/C JSON 库综合对比及应用案例 &#x1f4e2; 快速掌握 JSON&#xff01;文章 视频双管齐下 &#x1f680; 如果你觉得阅读文章太慢&#xff0c;或者更喜欢 边看边学 的方式&#xff0c;不妨直接观看我录制的 JSON 课程视频&#xff01;&#x1f3ac; …

LXC 导入(Rockylinux,almalinux,oraclelunx,debian,ubuntu,openEuler,kail,opensuse)

前提要求 ubuntu下安装lxd 参考Rockylinux下安装lxd 参考LXC 源替换参考LXC 容器端口发布参考LXC webui 管理<

Spring MVC 页面跳转方案与区别

SpringMVC 的页面跳转方案主要分为 ‌转发&#xff08;Forward&#xff09;‌ 和 ‌重定向&#xff08;Redirect&#xff09;‌ 两类&#xff0c;具体实现方式和区别如下&#xff1a; 一、页面跳转方案 1. ‌转发&#xff08;Forward&#xff09;‌ 默认方式‌&#xff1a;直…

基于Spring Boot的轻型卡车零部件销售平台的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

高性能计算面经

高性能计算面经 C八股文真景一面凉经自我介绍&#xff0c;介绍一下你做过的加速的模块(叠噪&#xff0c;噪声跟原图有什么关系&#xff1f;)OpenGL和OpenCL有什么区别&#xff1f;**1. 核心用途****2. 编程模型****3. 硬件抽象****4. API设计****5. 典型应用场景****6. 互操作性…

青少年编程与数学 02-014 高中数学知识点 07课题、专业相关性分析

青少年编程与数学 02-014 高中数学知识点 07课题、专业相关性分析 一、函数与微积分1. 函数与初等函数2. 导数与优化 二、概率与统计1. 概率基础2. 统计推断3. 随机变量与分布 三、几何与代数1. 向量与矩阵运算2. 复数与坐标变换 四、数学建模与算法思维1. 数学建模2. 算法逻辑…

11乱码问题的解释(2)

这个字符串使用哪种方式编码的?---看包含在哪个文件中 和当前 mylabel.cpp 文件的编码方式是一致的~~ 如果这里显示的是 UTF-8&#xff0c;说明这个文件就是UTF-8 编码 如果显示的是 ANSI,说明这个文件就是 GBK 编码~ Qt Creator 内置的终端是 utf8 的方式来显示字符串吗?? …