技海无涯:正则表达式相关的知识和技术(4)——自动机(完结篇)

自动机

自动机,顾名思义,就是能够自动完成事情的“机器”。但是为什么要用自动机,什么又叫“自动”呢?

我们看看普通的处理方式,简单的就是if了,例如:判断某字符串是否是“Hello,Word”,我们都会这么写:

if(str == “Hello,Word”)

普通的比较可以满足大部分的场景,但对于正则表达式这种比较的话,普通的if就完全不能满足了,例如a*b|c,可以是如下字符串:

ab

aab

aaaab

c

………….

这种情况我们不可能采用普通的if来判断了,因为不可能穷举所有的字符串。所以我们要另辟蹊径,自动机就应运而生了。

我们这里讲的自动机有两个:一个是确定有限自动机,又叫DFA;一个叫不确定有限自动机,又叫NFA。由于自动机的核心就是通过“状态”和“状态变迁”实现的,所以自动机又叫状态机。

1) NFA

为什么叫不确定自动机呢?就是因为存在“不确定性”了。

什么不确定呢?就是一个输入可能对应多个状态转换,所以就不确定了。

通过NFA来识别字符串的过程很简单,即每输入一个字符,都判断当前的状态集中哪些状态上有此字符的转换,然后把所有转换后的状态又记录下来,依此循环,直到字符输入结束或者状态机结束。

不知道大家有没有发现,NFA的识别过程其实非常类似将NFA转换到DFA的子集构造算法的过程。如下图:

NFA识别过程,假如识别aabb

(1)初始状态:0,1,2,4,7

(2)输入a,转换到如右的状态:3, 6, 7, 1 , 2 ,4,

(3)输入a,转换到如右的状态:8, 3, 6 , 7, 1, 2, 4

(4)输入b,转换到如右的状态:9, 5, 6, 7, 1, 2, 4

(5)输入b,转换到如右的状态:10, 5, 6, 7, 1, 2, 4

由于此时已经没有输入字符了,而且最终状态10也包含进来了,因此aabb就接受了。

 

NFA->DFA的子集构造算法:

(1)初始状态:0,1,2,4,7(第一个子集)

(2)输入a,转换到如右的状态:3, 6, 7, 1 , 2 ,4(第二个子集)

(3)输入a,转换到如右的状态:8, 3, 6 , 7, 1, 2, 4(第三个子集)

………………………..(依次类推)…………………………………………..

 

 

2) DFA.

介绍到这里,相信大家都已经明白DFA的概念了。

所谓确定,就是指一个输入只能对应一个转换。

而DFA来识别字符串就更简单了,由于转换是确定的,所以直接将输入字符输入进行转换即可。

 

3) NFA和DFA比较.

复杂度:当然是DFA高了;

速度:当然是DFA快了

 

到这里正则表达式系列相关知识也就结束了,当然我在这里知识提纲挈领,让大家能够从整体上把握这些相关的东东,不至于上来就被一堆术语和名词弄晕了,同时也把关键的地方点了一下,希望能够起到让大家茅塞顿开的效果。

当然更加详细和深入的研究还需要各位自己深入钻研了,推荐《编译原理(龙书)》和《精通正则表达式》两本书。

 

时间: 2024-12-03 00:08:05

技海无涯:正则表达式相关的知识和技术(4)——自动机(完结篇)的相关文章

技海无涯:正则表达式相关的知识和技术(1)——表达式

正则表达式,看似简单,实则博大精深.简简单单几个字符:|.*.(.)--却能够演绎出无穷无尽的变化.初看正则表达式,其实就是一串子字符串,但隐藏在这字符串背后的各种各样的知识.技能.技巧,却一点也不简单. 以前在学习<编译原理(龙书)>的时候,也是一目十行的将其跳过,这次偶尔需要用到正则表达式,然后自己就上网搜了搜,结果发现水不是一般的深,耗费了3个晚上的时间搜索.查阅,才稍微理清了这些相关知识的关系和脉络,于是稍作整理归纳,既为了加深自己的理解,也为了共享给各位. 在正式开始之前,先将相关东

技海无涯:正则表达式相关的知识和技术(3)——编程技巧:堆栈的本质探讨

编程技巧--堆栈的本质探讨 如果我要说本章的编程技巧就是为了介绍堆栈的使用技巧,你可能会笑掉大牙:哈哈,堆栈,这不是小儿科吗?!! 是的,每个编程的人都知道的堆栈,而且说起堆栈,大家肯定会马上想到"后进先出(LIFO)",这是教科书关于堆栈本质的解释. 没错,堆栈的本质是LIFO,但绝不是简单的先进后出就完了,结合各种各样的压栈出栈操作,堆栈可以实现很强大的功能.下面就以正则表达式涉及的两个例子来说明堆栈的妙用. 1) 通过堆栈来完成正则表达式->NFA. 在介绍表达式的时候提到

技海无涯:正则表达式相关的知识和技术(2)——算法

    转换算法 为了让正则表达式最终能够被机器识别,并且能够用其来匹配目标字符串,必须首先将正则表达式转换为NFA或者DFA(后面介绍)两种等价的自动机,一般的转换过程如下: 正则表达式-①->NFA-②->DFA. 当然也可以直接这样转换,当然这个算法复杂度更高: 正则表达式-③->DFA. 上面的每个过程对应一个算法,下面我们分别简单的介绍三种算法.   ①正则表达式-->NFA:Thompson 算法 算法本身是比较简单的,算法的关键如下:每个字符都构造一个NFA,然后用e

Java正则表达式基础入门知识_正则表达式

众所周知,在程序开发中,难免会遇到需要匹配.查找.替换.判断字符串的情况发生,而这些情况有时又比较复杂,如果用纯编码方式解决,往往会浪费程序员的时间及精力.因此,学习及使用正则表达式,便成了解决这一矛盾的主要手段. 大家都知道,正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符(元字符)组成的文字模式,它 用以描述在查找文字主体时待匹配的一个或多个字符串.正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配. 一:什么是正则表达式

接触C#的服务器端正则表达式相关验证

初次接触C#的服务器端正则表达式相关验证 后续将会在这个基础上 将这个C#的服务器端正则表达式相关内容 集结在这里 入门示例如下 //验证 string strFileName = "S_123456_200701.zip" System.Text.RegularExpressions.Regex strReg = new System.Text.RegularExpressions.Regex(@"^S_\d{6}_\d{6}\.zip$"); if (strRe

网络-请问谁知道 Van Jacobson TCP/IP包头压缩 相关的知识和具体报文格式?

问题描述 请问谁知道 Van Jacobson TCP/IP包头压缩 相关的知识和具体报文格式? 新人一个,没有什么分:Van Jacobson TCP/IP包头压缩降低了TCP/IP包头的大小到接近3个字节,这对于慢速的串行线路来说是一大提高.IP压缩协议配置选项用于指示接收压缩包的能力.如果需要两个方向都进行压缩则需要双方独立申请. 4.1.PPP协议域值 在传送IP包时PPP协议域被设置为以下值: 0021 类型IP.IP协议不是TCP,或包是一个数据段,或未经过压缩. 002d 压缩的T

javascript正则表达式的基本知识

javascript正则表达式的基本知识 1     javascript 正则对象创建 和用法     声明javascript 正则表达式          var reCat = new RegExp("cat");       你也可以      var reCat = /cat/;      //Perl 风格   (推荐) 2 学习最常用的 test exec match search  replace  split 6个方法    1) test  检查指定的字符串是否存

每个人在自己看病的经历中都能收获到很多相关的知识和经验

所谓"久病成良医",每个人在自己看病的经历中都能收获到很多相关的知识和经验,把这些经验搬到线上来,打造一个病患交流社区,则正是厦门初创公司"病患如我"正在做的事. "病患如我"是一个UGC病患交流社区.同时还具备数据挖掘能力,会收集整理论坛中患者贡献的,与疾病诊疗相关的数据. 在"病患如我"每一个对应疾病的分区里,用户讨论的药品种类.医院类别等数据会被进行统计,并整理成为统计图.而数据获取的方式主要有三个,一是患者在注册的时候

正则表达式的基本知识_正则表达式

正则表达式的基本知识: 元字符: 正则表达式的威力在于其能够在模式中包含选择和循环.它们通过使用 有两组不同的元字符:一种是模式中除了方括号内都能被识别的,还有一种是在方括号内被识别的.方括号之外的元字符有这些:  有数种用途的通用转义符  断言目标的开头(或在多行模式下行的开头,即紧随一换行符之后)  断言目标的结尾(或在多行模式下行的结尾,即紧随一换行符之前)  匹配除了换行符外的任意一个字符(默认情况下)  字符类定义开始  字符类定义结束  开始一个多选一的分支  子模式开始  子模式结