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

 

 

转换算法

为了让正则表达式最终能够被机器识别,并且能够用其来匹配目标字符串,必须首先将正则表达式转换为NFA或者DFA(后面介绍)两种等价的自动机,一般的转换过程如下:

正则表达式—①—>NFA—②—>DFA。

当然也可以直接这样转换,当然这个算法复杂度更高:

正则表达式—③—>DFA。

上面的每个过程对应一个算法,下面我们分别简单的介绍三种算法。

 

①正则表达式——>NFA:Thompson 算法

算法本身是比较简单的,算法的关键如下:每个字符都构造一个NFA,然后用epsilon变化将每个NFA连接起来。

具体的算法描述请参考《编译原理(龙书)》第一版的3.7.1章节。

 

②NFA—②—>DFA:子集构造算法

这个算法稍微复杂一些,算法关键如下:

1)区分状态和状态集:DFA中的状态,实际上对应NFA中的多个状态,也就是一个NFA状态集;这也是算法为什么叫子集算法的原因,因为DFA中的每一个状态实际上都是NFA状态集的一个子集。

2)二次转换:对于已经构造的DFA状态(NFA状态集),拿字符集循环验证状态集中的状态能否转换到其它状态,有二次转换:(1)首先看原有状态集中哪些状态包含指定字符的转换,(2)一旦转换成功,则这些转换后的状态后续所有能够经过一个或者多个epsilon转换到达的状态都要包含进来;。

 

③正则表达式——>DFA。

这个算法没有明确的名称,但其中用到了语法树的概念,因此我暂且称其为“语法树构造法”。

算法太复杂,我还没有时间来仔细研究,因此就不能详细介绍了:)有需要的大侠可以参考《编译原理(龙书)》第一版3.9.2章节。

 

④Shunting-yard算法

在介绍表达式的时候提到了中缀表达式、后缀表达式,将中缀表达式转换为后缀表达式的算法就是Shunting-yard算法。

详情请参考:http://en.wikipedia.org/wiki/Shunting_yard_algorithm

 

 

========================未完待续==================================

 

 

时间: 2024-10-02 20:00:19

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

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

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

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

自动机 自动机,顾名思义,就是能够自动完成事情的"机器".但是为什么要用自动机,什么又叫"自动"呢? 我们看看普通的处理方式,简单的就是if了,例如:判断某字符串是否是"Hello,Word",我们都会这么写: if(str == "Hello,Word") 普通的比较可以满足大部分的场景,但对于正则表达式这种比较的话,普通的if就完全不能满足了,例如a*b|c,可以是如下字符串: ab aab aaaab c ----. 这

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

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

多核程序设计的相关基础知识----以误差扩散算法为例

    本文从基础入手,主要阐述基于桌面电脑的多核程序设计的基础知识,包括一些向量化运算,虚拟机算,多线程等的相关知识总结. 一.计算平台的分类 单指令单数据流机器(SISD) 传统的串行计算机,所有指令都是串行. 多指令单数据流机器(MISD) 多个指令流同时对一个数据流进行处理.但是大多数情况下,多个指令流处理多个数据才是更加有效的处理方式. 单指令多数据流机器(SIMD) 几乎所有的计算机都实现了SIMD功能,intel处理器中实现的MMX,SSE,SSE2,SSE3等扩展指令集 说到这里

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病患交流社区.同时还具备数据挖掘能力,会收集整理论坛中患者贡献的,与疾病诊疗相关的数据. 在"病患如我"每一个对应疾病的分区里,用户讨论的药品种类.医院类别等数据会被进行统计,并整理成为统计图.而数据获取的方式主要有三个,一是患者在注册的时候