正则表达式教程 #1 概述(正则表达式大全(整理版))
ztj100 2024-11-06 13:18 17 浏览 0 评论
什么是正则表达式?
正则表达式(Regular Expression:在代码中常简写为regex、regexp或RE)他由普通字符(代表字符本身含义比如a代表字符a)、元字符(有特殊含义的特殊字符,比如\d代表0~9任意一位数字)构成的字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑
正则表达式能做什么?
实现两个功能:①搜索②替换
按某种逻辑规则组合定义的正则表达式(它原本就是一段字符串,有的书上称之为这段字符串为一个模式)用它来对一段文本进行快速检索出我们规则定义的内容,或者替换符合某个规则的文本为其他内容,当然我们用各种编程语言都能实现这个目的,所有正则表达式仅仅代表一个规范,语言无关性。
正则引擎实现:怎么实现字符串匹配的?
我们首先引入几个概念:FA、NFA、DFA 参考资料
- FA(Finite Automate有限自动机) 有限自动机 (Finite Automata) 是一个识别器 (recognizer),从起始状态开始,一个字符接一个字符地读入一个字符串,并根据给定的转移函数一步一步地转移至下一个状态,直至读完该字符串,并根据自动机的当前状态决定是否接受该字符串。
- DFA(Deterministic Finite Automata) 确定型有限自动机,文本主导的匹配,DFA从匹配文本入手,从左到右,每个字符不会匹配两次,它的时间复杂度是多项式的,所以通常情况下,它的速度更快,但支持的特性很少,不支持捕获组、各种引用等等;
- NFA(非确定型有限自动机) Nondeterministic Finite Automata 正则表达式主导的匹配,NFA则是从正则表达式入手,不断读入(cousume)字符,尝试是否匹配当前正则,不匹配则吐出(回溯)字符重新尝试,通常它的速度比较慢,最优时间复杂度为多项式的,最差情况为指数级的。但NFA支持更多的特性,因而绝大多数编程场景下(包括java,js,c#),我们面对的是NFA
一个正则表达式可以表示为一个有限自动机,模拟运行该有限自动机进行字符串识别,即可实现正则表达式匹配,其中分三个过程:
- Parser: 正则表达式解析器,即将正则表达式字符串解析为正则表达式抽象语法树,方便后续处理。
- Compiler: 正则表达式编译器,即将正则表达式转换为等效的 NFA,再根据情况是否将 NFA 转换为 DFA。
- Matcher: 正则表达式匹配器,运行该正则表达式的等效 NFA 或 DFA,对输入字符串进行识别匹配。我们用两种模式来分析下面这个例子
final String reg = "abd";
final String str = "abcabdf";
final Pattern pattern = Pattern.compile(reg);
final Matcher matcher = pattern.matcher(str);
// 提取匹配文本
List<String> result = RegexUtils.groupExtract(pattern, str);
log.debug("替换结果: {}", result);
DFA:(正则不回退,一条道路走到黑)
- 从str[0]开始匹配正则表达式reg[0]位置开始第一次匹配,匹配成功,正则表达式还未结束,继续
- str[1]和reg[1]匹配成功,继续匹配
- str[2]和reg[2]匹配失败,字符串未消费完,继续匹配
- str[3]和reg[0]匹配成功,字符串未消费完,继续匹配
- str[4]和reg[1]匹配成功,字符串未消费完,继续匹配
- str[5]和reg[2]匹配成功,正则表达式结束,匹配成功一次,字符串未消耗完成,继续下一次匹配
- str[6]和reg[0],匹配失败,字符串消耗完成,结束匹配
NFA:(正则回退,条条大道通罗马,总有一个妹纸属于哥的)
- 开始匹配:str[0]匹配reg[0]位置开始第一次匹配,匹配成功,正则表达式还未结束,继续
- 继续匹配:str[1]和reg[1]匹配成功,
- 继续匹配str[2]和reg[2]匹配失败,字符串回溯到最先匹配成功的下一位str[1]
- 继续匹配str[1]匹配reg[0],匹配失败,字符串未消费完,继续匹配
- 继续匹配str[2]和reg[0],匹配失败,字符串未消费完,继续匹配
- 继续匹配str[3]和reg[0],匹配成功,字符串未消费完,继续匹配
- 继续匹配str[4]和reg[1],匹配成功,字符串未消费完,继续匹配
- 继续匹配str[5]和reg[2],匹配成功,正则表达式结束,匹配成功一次,字符串未消耗完成,继续下一次匹配
- 继续匹配str[6]和reg[0],匹配失败,字符串消耗完成,结束匹配
通过两种方式可以实现一个正则表达式的引擎来解析字符串
学习实现目标:
- 如何解析一个html文档标签元素?
- 如何解析动态脚步,比如sql语句,where语句,计算公式等?
相关推荐
- Whoosh,纯python编写轻量级搜索工具
-
引言在许多应用程序中,搜索功能是至关重要的。Whoosh是一个纯Python编写的轻量级搜索引擎库,可以帮助我们快速构建搜索功能。无论是在网站、博客还是本地应用程序中,Whoosh都能提供高效的全文搜...
- 如何用Python实现二分搜索算法(python二分法查找代码)
-
如何用Python实现二分搜索算法二分搜索(BinarySearch)是一种高效的查找算法,适用于在有序数组中快速定位目标值。其核心思想是通过不断缩小搜索范围,每次将问题规模减半,时间复杂度为(O...
- 路径扫描 -- dirsearch(路径查找器怎么使用)
-
外表干净是尊重别人,内心干净是尊重自己,干净,在今天这个时代,应该是一种极高的赞美和珍贵。。。----网易云热评一、软件介绍Dirsearch是一种命令行工具,可以强制获取web服务器中的目录和文件...
- 78行Python代码帮你复现微信撤回消息!
-
来源:悟空智能科技本文约700字,建议阅读5分钟。本文基于python的微信开源库itchat,教你如何收集私聊撤回的信息。...
- 从零开始学习 Python!2《进阶知识》 Python进阶之路
-
欢迎来到Python学习的进阶篇章!如果你说已经掌握了基础语法,那么这篇就是你开启高手之路的大门。我们将一起探讨面向对象编程...
- 白帽黑客如何通过dirsearch脚本工具扫描和收集网站敏感文件
-
一、背景介绍...
- Python之txt数据预定替换word预定义定位标记生成word报告(四)
-
续接Python之txt数据预定替换word预定义定位标记生成word报告(一)https://mp.toutiao.com/profile_v4/graphic/preview?pgc_id=748...
- Python——字符串和正则表达式中的反斜杠('\')问题详解
-
在本篇文章里小编给大家整理的是关于Python字符串和正则表达式中的反斜杠('\')问题以及相关知识点,有需要的朋友们可以学习下。在Python普通字符串中在Python中,我们用'\'来转义某些普通...
- Python re模块:正则表达式综合指南
-
Python...
- python之re模块(python re模块sub)
-
re模块一.re模块的介绍1.什么是正则表达式"定义:正则表达式是一种对字符和特殊字符操作的一种逻辑公式,从特定的字符中,用正则表达字符来过滤的逻辑。(也是一种文本模式;)2、正则表达式可以帮助我们...
- MySQL、PostgreSQL、SQL Server 数据库导入导出实操全解
-
在数字化时代,数据是关键资产,数据库的导入导出操作则是连接数据与应用场景的桥梁。以下是常见数据库导入导出的实用方法及代码,包含更多细节和特殊情况处理,助你应对各种实际场景。一、MySQL数据库...
- Zabbix监控系统系列之六:监控 mysql
-
zabbix监控mysql1、监控规划在创建监控项之前要尽量考虑清楚要监控什么,怎么监控,监控数据如何存储,监控数据如何展现,如何处理报警等。要进行监控的系统规划需要对Zabbix很了解,这里只是...
- mysql系列之一文详解Navicat工具的使用(二)
-
本章内容是系列内容的第二部分,主要介绍Navicat工具的使用。若查看第一部分请见:...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- Whoosh,纯python编写轻量级搜索工具
- 如何用Python实现二分搜索算法(python二分法查找代码)
- 路径扫描 -- dirsearch(路径查找器怎么使用)
- 78行Python代码帮你复现微信撤回消息!
- 从零开始学习 Python!2《进阶知识》 Python进阶之路
- 白帽黑客如何通过dirsearch脚本工具扫描和收集网站敏感文件
- Python之txt数据预定替换word预定义定位标记生成word报告(四)
- 假期苦短,我用Python!这有个自动回复拜年信息的小程序
- Python——字符串和正则表达式中的反斜杠('\')问题详解
- Python re模块:正则表达式综合指南
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- node卸载 (33)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- exceptionininitializererror (33)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)