百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

正则表达式教程 #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],匹配失败,字符串消耗完成,结束匹配

通过两种方式可以实现一个正则表达式的引擎来解析字符串

学习实现目标:

  1. 如何解析一个html文档标签元素?
  2. 如何解析动态脚步,比如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——字符串和正则表达式中的反斜杠(&#39;\&#39;)问题详解

在本篇文章里小编给大家整理的是关于Python字符串和正则表达式中的反斜杠('\')问题以及相关知识点,有需要的朋友们可以学习下。在Python普通字符串中在Python中,我们用'\'来转义某些普通...

Python re模块:正则表达式综合指南

Python...

Python中re模块详解(rem python)

在《...

python之re模块(python re模块sub)

re模块一.re模块的介绍1.什么是正则表达式"定义:正则表达式是一种对字符和特殊字符操作的一种逻辑公式,从特定的字符中,用正则表达字符来过滤的逻辑。(也是一种文本模式;)2、正则表达式可以帮助我们...

MySQL、PostgreSQL、SQL Server 数据库导入导出实操全解

在数字化时代,数据是关键资产,数据库的导入导出操作则是连接数据与应用场景的桥梁。以下是常见数据库导入导出的实用方法及代码,包含更多细节和特殊情况处理,助你应对各种实际场景。一、MySQL数据库...

Zabbix监控系统系列之六:监控 mysql

zabbix监控mysql1、监控规划在创建监控项之前要尽量考虑清楚要监控什么,怎么监控,监控数据如何存储,监控数据如何展现,如何处理报警等。要进行监控的系统规划需要对Zabbix很了解,这里只是...

mysql系列之一文详解Navicat工具的使用(二)

本章内容是系列内容的第二部分,主要介绍Navicat工具的使用。若查看第一部分请见:...

取消回复欢迎 发表评论: