正则表达式基础与应用

什么是正则表达式?

正则表达式(Regular Expression,在代码中常简写为regex、regexp或RE)是一种用于描述字符串结构的语法规则。它定义了一个搜索模式,可以用来匹配、替换或提取文本中的子串。正则表达式广泛应用于文本处理、数据验证、查找和替换等场景。

正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。


正则表达式的语法规则

正则表达式由元字符(metacharacters)和文本字符(literal characters)两部分构成。元字符具有特殊的功能,而文本字符则是普通的字符。

元字符

  • ^:匹配行的开始位置。
  • $:匹配行的结束位置。
  • .:匹配除换行符之外的任何单个字符。
  • []:字符类,用于匹配某个范围内的字符。
  • |:选择符,表示“或”。
  • \:转义字符,用于转义元字符,或者表示一些预定义字符类。
  • () :分组和捕获。
  • {}:限定符,指定前面的字符重复出现的次数。

例子

/\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/   # 一个常见的邮箱匹配表达式

为了简化表达和更易阅读,后续我们省略掉定界符(/)部分,直接呈现正则表达式的核心内容。

常见元字符与用法

行定位符

  • ^:匹配字符串的开始。例如,^tm 会匹配行首的 tm
  • $:匹配字符串的结束。例如,tm$ 会匹配行尾的 tm

单词定界符

  • \b:匹配一个单词的边界,表示匹配完整的单词。例如,\btm\b 会匹配独立的 tm
  • \B:与 \b 相反,表示不匹配单词边界。

字符类

  • [abc]:匹配方括号中的任意单个字符,如 abc
  • [^abc]:匹配不在方括号中的字符,如除了 abc 外的任何字符。

预定义字符类

  • \d:匹配任意一个数字,等同于 [0-9]
  • \D:匹配非数字字符,等同于 [^0-9]
  • \w:匹配任意一个字母、数字或下划线,等同于 [a-zA-Z0-9_]
  • \W:匹配非字母、非数字和非下划线字符。
  • \s:匹配任意一个空白字符(包括空格、制表符、换行符等)。
  • \S:匹配非空白字符。

限定符(量词)

  • ?:匹配前面的字符零次或一次。例如,colou?r 可以匹配 colorcolour
  • +:匹配前面的字符一次或多次。例如,go+gle 可以匹配 goglegooggle 等。
  • *:匹配前面的字符零次或多次。例如,go*gle 可以匹配 glegooglegooggle 等。
  • {n}:匹配前面的字符恰好 n 次。例如,go{2}gle 只会匹配 google
  • {n,}:匹配前面的字符至少 n 次。例如,go{2,}gle 可以匹配 googlegooggle 等。
  • {n,m}:匹配前面的字符至少 n 次,最多 m 次。例如,employe{0,2} 可以匹配 employemployeemployee

选择字符(|)

  • |:表示“或”操作。例如,(T|t)(M|m) 可以匹配 TMTmtMtm

连字符(-)

  • -:表示字符范围。例如,[a-zA-Z] 可以匹配任何大小写字母。

括号字符(())

  • ():用于分组。例如,(thir|four)th 可以匹配 thirthfourth
  • 分组的作用不仅仅是捕获子表达式,还能影响其他操作符(如 *+ 等)的应用范围。
  • (?: ... ):非捕获组,用于分组,但不捕获匹配的内容,可以提高性能,并避免捕获组编号的混乱。

转义字符(\)

  • \:用来转义元字符,使其失去特殊意义。例如,\. 匹配字面上的点号 .
  • 反斜线还可以用于表示一些特殊字符或定义字符集:\d 表示数字,\s 表示空白字符等。

断言(环视)

断言用于匹配某些位置,不会消耗字符,但可以检查字符的上下文。

  • 顺序环视(前瞻)(?=...),表示匹配前面必须跟着某个子串。例如,\s(?=is) 匹配空格,后面紧跟着 is
  • 逆序环视(后顾)(?<=...),表示匹配前面有某个子串。例如,(?<=is)\s 匹配 is 后面的空格。

模式修饰符

模式修饰符用于修改正则表达式的行为。

  • i:忽略大小写。例如,/abc/i 可以匹配 abcABC 等。
  • m:多行模式,影响 ^$ 的行为,使其匹配每一行的开始和结束。
  • s:单行模式,使 . 能够匹配换行符。
  • x:忽略正则表达式中的空格,方便书写复杂的正则。

常用表达式演示

数字校验:

数字:^ [0-9]*$
n位的数字:^\d{n}$
至少n位的数字:^\d{n,}$
m-n位的数字:^\d{m,n}$
零和非零开头的数字:^(0|[1-9][0-9]*)$
非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$
带1-2位小数的正数或负数:^(-)?\d+(.\d{1,2})?$
正数、负数、和小数:^(-|+)?\d+(.\d+)?$
有两位小数的正实数:^ [0-9]+(.[0-9]{2})?$
有1~3位小数的正实数:^ [0-9]+(.[0-9]{1,3})?$
非零的正整数:^ [1-9]\d*$ 或 ^([1-9][0-9]){1,3}$ 或 ^+?[1-9][0-9]$
非零的负整数:^-[1-9][]0-9"$ 或 ^-[1-9]\d$
非负整数:^\d+$ 或 ^ [1-9]\d*|0$
非正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
非负浮点数:^\d+(.\d+)?$ 或 ^ [1-9]\d*.\d*|0.\d*[1-9]\d*|0?.0+|0$
非正浮点数:^((-\d+(.\d+)?)|(0+(.0+)?))$ 或 ^(-([1-9]\d*.\d*|0.\d*[1-9]\d*))|0?.0+|0$
正浮点数:^ [1-9]\d*.\d*|0.\d*[1-9]\d*$ 或 ^ (([0-9]+.[0-9][1-9][0-9])|([0-9][1-9][0-9].[0-9]+)|([0-9][1-9][0-9]))$
负浮点数:^-([1-9]\d*.\d*|0.\d*[1-9]\d*)$ 或 ^(-(([0-9]+.[0-9][1-9][0-9])|([0-9][1-9][0-9].[0-9]+)|([0-9][1-9][0-9])))$
浮点数:^(-?\d+)(.\d+)?$ 或 ^-?([1-9]\d*.\d*|0.\d*[1-9]\d*|0?.0+|0)$

验证字符:

汉字 :^ [\u4e00-\u9fa5]{0,}$
英文和数字:^ [A-Za-z0-9]+$ 或 ^ [A-Za-z0-9]{4,40}$
长度为3-20的所有字符:^.{3,20}$
由26个英文字母组成的字符串:^ [A-Za-z]+$
由26个大写英文字母组成的字符串:^ [A-Z]+$
由26个小写英文字母组成的字符串:^ [a-z]+$
由数字和26个英文字母组成的字符串:^ [A-Za-z0-9]+$
由数字、26个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$
中文、英文、数字包括下划线:^ [\u4E00-\u9FA5A-Za-z0-9_]+$
中文、英文、数字但不包括下划线等符号:^ [\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^ [\u4E00-\u9FA5A-Za-z0-9]{2,20}$

其他常用验证

1.域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?2.手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$3.身份证号(15位、18位数字):^\d{15}|\d{18}$4.密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^ [a-zA-Z]\w{5,17}$5.日期格式:^\d{4}-\d{1,2}-\d{1,2}6.一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$7.一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$8.xml文件:^([a-zA-Z]±?)+[a-zA-Z0-9]+\.[x|X][m|M][l|L]$9.中文字符的正则表达式:[\u4e00-\u9fa5]10.QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)11.中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)12.IP地址:\d+.\d+.\d+.\d+ (提取IP地址时有用)13.IP地址:(( ? : ( ?:25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d?\d))14.文件扩展名效验:^([a-zA-Z]\: |\\)\\([^\\]+\\)* [ ^ \/: * ?"<>|]+\.txt(l)?$

拓展:正则表达式引擎

正则表达式引擎(Regular Expression Engine)是用于执行正则表达式匹配和替换操作的软件组件。它接收正则表达式和输入文本作为输入,输出是否匹配的结果,或者返回匹配的部分内容。不同的编程语言和工具提供了不同类型的正则表达式引擎,它们根据底层实现的不同,可能在性能和特性上有所差异。

常见术语

  1. grep:最初是 Unix 系统中的一个命令,用于在文件中搜索特定的内容。后来它成为一个独立的工具,用于处理文本数据。
  2. egrep:是 grep 命令的扩展版本,增强了正则表达式的能力,支持更复杂的模式匹配。
  3. POSIX:是可移植操作系统接口的标准,它并不是最终的标准,而是为确保操作系统之间的可移植性提供的参考。
  4. Perl:是实际抽取与汇报语言,POSIX 标准之后的另一种正则表达式标准。
  5. PCRE:即兼容 Perl 正则表达式的正则引擎,支持更强大的功能,并可以整合到 PHP 等其他语言中。

正则表达式引擎的主要类型

  1. NFA(Non-deterministic Finite Automaton)
    非确定性有限自动机(NFA)是一种较为常见的正则表达式引擎实现方式。NFA 引擎根据状态转移图的概念工作,并且可以有效地处理很多常见的正则表达式操作。NFA 引擎的工作原理是:它尝试将输入字符串与正则表达式从左到右进行匹配,使用状态机的方式进行尝试。

    • 优点:NFA 引擎具有灵活性,能够轻松处理多种复杂的正则表达式。
    • 缺点:在处理某些复杂或不常见的正则表达式时,可能导致性能较差,特别是在匹配非常长的文本时。
  2. DFA(Deterministic Finite Automaton)
    确定性有限自动机(DFA)与 NFA 相对,它的状态转移图更为简单和明确,每个状态只有一个唯一的后续状态。DFA 引擎的实现通常比 NFA 更为高效,尤其是在文本匹配时。

    • 优点:DFA 引擎通常能够提供较高的匹配速度,因为它在匹配时只有一个确定的路径。
    • 缺点:DFA 引擎的设计通常要求更多的内存,特别是当正则表达式的模式非常复杂时。
  3. 回溯(Backtracking)
    回溯引擎是一种常见的正则表达式引擎实现方式,尤其在如 PCRE(Perl Compatible Regular Expressions)等工具中得到了广泛应用。回溯引擎通过递归地尝试各种匹配路径来寻找符合正则表达式模式的子串。它会从开始状态尝试每一种可能的匹配路径,直到找到匹配或确认没有匹配。

    • 优点:回溯引擎灵活,能够处理复杂的正则表达式模式。
    • 缺点:在某些情况下,回溯引擎可能会导致性能下降,特别是在处理复杂的表达式时,可能出现所谓的“灾难性回溯”问题(例如,正则表达式包含多个可能的匹配路径,导致大量的无效计算)。
  4. 正则表达式虚拟机(REVM)
    正则表达式虚拟机是某些正则表达式引擎使用的另一种技术。它将正则表达式转化为一种类似于程序代码的格式,然后执行该代码进行匹配。REVM 主要通过编译将正则表达式转换为某种中间代码,再通过虚拟机解释执行该中间代码。

    • 优点:这种方法可以结合编译和解释的优点,可能在某些情况下提高匹配速度。
    • 缺点:这种方法的实现较为复杂,需要在引擎中进行更多的计算和转换。

常见正则表达式引擎

  1. PCRE(Perl Compatible Regular Expressions)
    PCRE 是一种流行的正则表达式引擎,它与 Perl 语言的正则表达式兼容,广泛用于 PHP、Apache、NGINX 等开源项目。PCRE 引擎使用回溯算法,支持丰富的正则语法。

  2. RE2
    RE2 是 Google 提供的一个正则表达式引擎,设计目标是提供一个高效且没有回溯的正则匹配功能。RE2 引擎通常能够避免性能陷阱,适合处理大规模数据集。

  3. JavaScript 引擎(如 V8 引擎)
    JavaScript 引擎(例如 V8)实现了正则表达式的支持,通常使用回溯算法。它是现代浏览器中常见的正则表达式引擎。

  4. Python 正则表达式(re 模块)
    Python 的 re 模块使用回溯算法来实现正则匹配。它支持 Perl 风格的正则语法,灵活且易用。

  5. .NET 正则表达式引擎
    .NET 提供了强大的正则表达式支持,内置于 System.Text.RegularExpressions 类库中,采用回溯引擎。它支持多种正则表达式功能,并且优化了性能,适合 .NET 平台使用。

  6. POSIX 正则表达式
    POSIX 标准为 Unix-like 系统提供了一个正则表达式的标准。与其他正则表达式引擎相比,POSIX 更注重跨平台的兼容性,但在性能和特性上相对较弱。

例如,在 PHP 中,正则表达式支持两种格式:POSIXPCRE。其中,PCRE(Perl Compatible Regular Expressions)兼容 Perl 风格的正则表达式,是 PHP 中最常用的正则引擎。


小结

正则表达式是强大的文本处理工具,通过掌握其基本语法规则,可以方便地对字符串进行匹配、查找和替换等操作。掌握元字符、限定符、断言等功能,能够帮助我们构建更精确和高效的正则表达式。

正则表达式的学习需要耐心,理解每个元字符的含义以及如何组合它们来构建复杂的匹配模式是掌握正则的关键。

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

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

相关文章

速通 AI+Web3 开发技能: 免费课程+前沿洞察

AI 正以前所未有的速度重塑各行各业&#xff0c;从生成式模型到大规模数据处理&#xff0c;AI 逐渐成为核心驱动力。与此同时&#xff0c;Web3 去中心化技术也在重新定义信任、交易和协作方式。当这两大前沿技术相遇&#xff0c;AI Web3 的融合已不再是理论&#xff0c;而是未…

国产编辑器EverEdit - 输出窗口

1 输出窗口 1.1 应用场景 输出窗口可以显示用户执行某些操作的结果&#xff0c;主要包括&#xff1a; 查找类&#xff1a;查找全部&#xff0c;筛选等待操作&#xff0c;可以把查找结果打印到输出窗口中&#xff1b; 程序类&#xff1a;在执行外部程序时(如&#xff1a;命令窗…

硬件学习笔记--35 AD23的使用常规操作

原理图设计 1&#xff09;新建原理图&#xff0c;File-new-Schematic。相关设置参考&#xff0c;主要包含图纸设置以及常规的工具栏。 PCB的设计 新建PCB&#xff0c;设置相应的规则&#xff08;与原理图中相对应&#xff09;&#xff0c;放到同一个工程中。如果有上一版本的…

2025美赛MCM数学建模A题:《石头台阶的“记忆”:如何用数学揭开历史的足迹》(全网最全思路+模型)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ 《石头台阶的“记忆”&#xff1a;如何用数学揭开历史的足迹》 目录 《石头台阶的“记忆”&#xff1a;如何用数学揭开历史的足迹》 ✨摘要✨ ✨引言✨ 1. 引言的结构 2. 撰写步骤 &#xff08;1&#xff09;研究背景 &#…

MongoDB 备份与恢复综述

目录 一、基本概述 二、逻辑备份 1、全量备份 2、增量备份 3、恢复 三、物理备份 1、cp/tar/fsync 2、WiredTiger 热备份 3、恢复 四、快照备份 一、基本概述 MongoDB 是一种流行的 NoSQL 数据库&#xff0c;它使用文档存储数据&#xff0c;支持丰富的查询语言和索引…

StarRocks BE源码编译、CLion高亮跳转方法

阅读SR BE源码时&#xff0c;很多类的引用位置爆红找不到&#xff0c;或无法跳转过去&#xff0c;而自己的Linux机器往往缺乏各种C依赖库&#xff0c;配置安装比较麻烦&#xff0c;因此总体的思路是通过CLion远程连接SR社区已经安装完各种依赖库的Docker容器&#xff0c;进行编…

[RoarCTF 2019]Easy Calc1

题目 查看页面源代码 <script>$(#calc).submit(function(){$.ajax({url:"calc.php?num"encodeURIComponent($("#content").val()),type:GET,success:function(data){$("#result").html(<div class"alert alert-success">…

C++异常处理

目录 一、C语言的异常处理方式 二、C异常处理基本概念 三、异常处理的使用 1.异常抛出和捕获的匹配原则 2.异常的重新抛出 3.不建议抛出异常的情况 4.抛出异常规范 四、抛出派生类对象&#xff0c;使用基类捕获 一、C语言的异常处理方式 C语言对于异常处理方式通常为直…

VScode 开发 Springboot 程序

1. 通过maven创建springboot程序 输入 mvn archetype:generate 选择模板&#xff0c;一般默认选择为第 7 种方式&#xff1b; 选择之后&#xff0c;一般要你填写如下内容&#xff1a; groupId: 组织名称&#xff1b;artifactId: 项目名称&#xff1b;version: 版本&#xff0…

12Express简易实战项目(编写api)

12Express简易实战项目 1.初始化1.1 创建项目1.2 配置 cors 跨域1.3配置解析表单数据的中间件1.4 初始化路由相关的文件夹1.5 初始化用户路由模块1.6 抽离用户路由模块中的处理函数 2.登录注册2.1 新建 ev_users 表2.2 安装并配置 mysql 模块2.3 注册(1)实现步骤(2)检测表单数据…

Windows系统Tai时长统计工具的使用体验

Windows系统Tai时长统计工具的使用体验 一、Tai介绍1.1 Tai简介1.2 安装环境要求 二、下载及安装Tai2.1 下载Tai2.2 运行Tai工具 三、Tai的使用体验3.1 系统设置3.2 时长统计3.3 分类管理 四、总结 一、Tai介绍 1.1 Tai简介 Tai是一款专为Windows系统设计的开源软件&#xff…

数据结构——二叉树——堆(1)

今天&#xff0c;我们来写一篇关于数据结构的二叉树的知识。 在学习真正的二叉树之前&#xff0c;我们必不可少的先了解一下二叉树的相关概念。 一&#xff1a;树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层…

Vue入门(Vue基本语法、axios、组件、事件分发)

Vue入门 Vue概述 Vue (读音/vju/&#xff0c;类似于view)是一套用于构建用户界面的渐进式框架&#xff0c;发布于2014年2月。与其它大型框架不同的是&#xff0c;Vue被设计为可以自底向上逐层应用。Vue的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三…

数据结构:二叉树—面试题(二)

1、二叉树的最近公共祖先 习题链接https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/description/ 描述&#xff1a; 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点…

使用python-docx包进行多文件word文字、字符批量替换

1、首先下载pycharm。 2、改为中文。 3、安装python-docx包。 搜索包名字&#xff0c;安装。 4、新建py文件&#xff0c;写程序。 from docx import Documentdef replace1(array1):# 替换词典&#xff08;标签值按实际情况修改&#xff09;dic {替换词1: array1[0], 替换…

[操作系统] 进程地址空间管理

虚拟地址空间的初始化 缺页中断 缺页中断的概念 缺页中断&#xff08;Page Fault Interrupt&#xff09; 是指当程序访问的虚拟地址在页表中不存在有效映射&#xff08;即该页未加载到内存中&#xff09;时&#xff0c;CPU 会发出一个中断信号&#xff0c;请求操作系统加载所…

万字长文总结前端开发知识---JavaScriptVue3Axios

JavaScript学习目录 一、JavaScript1. 引入方式1.1 内部脚本 (Inline Script)1.2 外部脚本 (External Script) 2. 基础语法2.1 声明变量2.2 声明常量2.3 输出信息 3. 数据类型3.1 基本数据类型3.2 模板字符串 4. 函数4.1 具名函数 (Named Function)4.2 匿名函数 (Anonymous Fun…

【Linux】21.基础IO(3)

文章目录 3. 动态库和静态库3.1 静态库与动态库3.2 静态库的制作和使用原理3.3 动态库的制作和使用原理3.3.1 动态库是怎么被加载的 3.4 关于地址 3. 动态库和静态库 3.1 静态库与动态库 静态库&#xff08;.a&#xff09;&#xff1a;程序在编译链接的时候把库的代码链接到可…

Linux系统之gzip命令的基本使用

Linux系统之gzip命令的基本使用 一、gzip命令简介二、gzip命令使用帮助2.1 help帮助信息2.2 选项解释 三、gzip命令的基本使用3.1 压缩文件3.2 保留原始文件3.3 解压文件3.4 查看压缩信息3.5 标准输出/输入3.6 批量处理文件3.7 递归解压缩目录3.8测试压缩文件完整性 四、注意事…

【Matlab高端绘图SCI绘图模板】第05期 绘制高阶折线图

1.折线图简介 折线图是一个由点和线组成的统计图表&#xff0c;常用来表示数值随连续时间间隔或有序类别的变化。在折线图中&#xff0c;x 轴通常用作连续时间间隔或有序类别&#xff08;比如阶段1&#xff0c;阶段2&#xff0c;阶段3&#xff09;。y 轴用于量化的数据&#x…