NFA 、DFA 简述
转载请注明出处 https://www.cnblogs.com/majianming/p/11823697.html
目前常见的正则表达引擎总体分为2种,DFA (确定型有穷状态自动机) 和 NFA (非确定型有穷状态自动机)
如果细分,NFA 可以分为传统NFA和POSIX NFA
那么如何区分3者
如果某种正则引擎如果他不能匹配能很快给出结果,那么他可能是DFA
如果只有在能够匹配的时候才能快速给出结果,那么就是传统NFA
如果无论能不能匹配,匹配的时间都基本一致,那么就是POSIX NFA
why ?
首先先看 DFA,DFA 是文本主导的表达式引擎,实际上,对于确定的DFA表达式,状态的个数是确定的,这个也是为什么是确定型有穷状态
通过DFA 表达式,可以分析出所有可能的匹配路径,也就是说,在匹配还没开始的时候,所有路径都已经确定了(如果遇到某个字符 就走某个指定的路径),接下来需要做的就是在匹配文本,然后删掉不符合的路径,如果中途存在没有的路径,那么匹配失败,如果到最后存在多条匹配成功的路径,那么取匹配最长的路径
另外DFA 不支持反向引用和环视
而NFA 是表达式主导的引擎,也就是说实际上是拿文本到表达式测试,如果成功就继续匹配,失败就回溯或者选择其他分支或者报告匹配失败
在NFA中分为两种引擎,传统NFA和POSIX NFA
传统NFA和POSIX NFA的区别是传统NFA 如果如果找到一个匹配,那么就会直接报告这个匹配,POSIX NFA会尝试所有可能的匹配,如果有多个匹配,返回最长最左的匹配
所以在能够匹配的时候NFA 只需要找到一个匹配就能返回了,相对速度会很快,因为POSIX NFA 需要尝试所有可能才会报告是否匹配成功,所以时间是一致的。
| 引擎类型 | 程序 | 忽略优先量词(懒惰) | 捕获型括号 | 回溯 | 
|---|---|---|---|---|
| DFA | awk(大多数版本)、egrep(大多数版本)、flex、lex、MySQL、Procmail | 
不支持 | 不支持 | 不支持 | 
| 传统型 NFA | GNU Emacs、Java、grep(大多数版本)、less、more、.NET 语言、PCRE library、Perl、PHP(所有三套正则库)、Python、Ruby、sed(大多数版本)、vi | 
支持 | 支持 | 支持,但性能差 | 
| POSIX NFA | mawk、Mortice Kern Systems’utilities、GNU Emacs(明确指定时使用) | 
不支持 | 支持 | 支持,但性能差 | 
| DFA/NFA 混合 | GNU awk、GNU grep/egrep、Tcl | 
支持 | 支持 | DFA 支持 | 
转载请注明出处 https://www.cnblogs.com/majianming/p/11823697.html
NFA 、DFA 简述的更多相关文章
- 编译系统中的 NFA/DFA算法理解
		
1.问题概述 NFA 和 DFA浅析---要深入了解正则表达式,必须首先理解有穷自动机. 有穷自动机(Finite Automate)是用来模拟实物系统的数学模型,它包括如下五个部分: 有穷状态集St ...
 - NFA/DFA算法
		
1.问题概述 随着计算机语言的结构越来越复杂,为了开发优秀的编译器,人们已经渐渐感到将词 法分析独立出来做研究的重要性.不过词法分析器的作用却不限于此.回想一下我们的老师刚刚开始向我们讲述程序设计的时 ...
 - 编译原理--NFA/DFA
		
现成的, 讲义: https://www.cnblogs.com/AndyEvans/p/10240790.html https://www.cnblogs.com/AndyEvans/p/10241 ...
 - 编译原理实验 NFA子集法构造DFA,DFA的识别 c++11实现
		
实验内容 将非确定性有限状态自动机通过子集法构造确定性有限状态自动机. 实验步骤 1,读入NFA状态.注意最后需要设置终止状态. 2,初始态取空,构造DFA的l0状态,将l0加入未标记状态队列que ...
 - 什么是NFA(不确定的有穷自动机)和DFA(确定的有穷自动机)
		
本节知识点是<编译原理>第三章-词法分析,学习参考教材为清华大学出版社<编译原理>第三版: 前情提要: 字母表∑1和∑2的乘积( product): ∑1∑2 ={ab|a ∈ ...
 - NFA和DFA的区别
		
NFA DFA 初始状态 不唯一 唯一 弧上的标记 字(单字符字/ε) 字符(串) 转换关系 非确定 确定 对于每个NFA M都存在一个DFA M' 使得 L(M) = L(M')
 - NFA引擎匹配原理
		
1 为什么要了解引擎匹配原理 一个个音符杂乱无章的组合在一起,弹奏出的或许就是噪音,同样的音符经过作曲家的手,就可以谱出非常动听的乐曲,一个演奏者同样可以照着乐谱奏出动听的乐曲,但他/她或 ...
 - 正则表达式: NFA引擎匹配原理
		
NFA引擎匹配原理 1 为什么要了解引擎匹配原理 一个个音符杂乱无章的组合在一起,弹奏出的或许就是噪音,同样的音符经过作曲家的手,就可以谱出非常动听的乐曲,一个演奏者同样可以照着乐谱奏出动 ...
 - 编译原理-词法分析05-正则表达式到DFA-01
		
编译原理-词法分析05-正则表达式到DFA 要经历 正则表达式 --> NFA --> DFA 的过程. 0. 术语 Thompson构造Thompson Construction 利用ε ...
 
随机推荐
- Debian取消从光盘安装软件的方式(please insert the disc labeled)
			
与Ubuntu不同,使用apt-get install packages时Debian可能会提示: Media change: please insert the disc labeled 'Debi ...
 - spring aop 的五种通知类型
			
本文转自:http://blog.csdn.net/cqabl/article/details/46965197 spring aop通知(advice)分成五类: 前置通知[Before advic ...
 - linux0.11源码内核——系统调用,int80的实现细节
			
linux0.11添加系统调用的步骤 假设添加一个系统调用foo() 1.修改include/linux/sys.h 添加声明 extern int foo(); 同时在sys_call_table数 ...
 - 10.18.1 linux文本编辑器vim
			
vi和vim的区别 编辑一个文本时,vi不会显示颜色,而vim会显示颜色,vi 有点类似windows记事本,简单,那么就是vim复杂编辑器,功能复杂,高亮,自动缩进(写shell/python脚本用 ...
 - 初识 ❤ TensorFlow |【一见倾心】
			
说明
 - (转)PAL制式和NTSC制式的区别
			
转:https://www.cnblogs.com/nx520zj/articles/6061777.html 常见的电视信号制式是PAL和NTSC,另外还有SECAM等. NTSC即正交平衡调幅制. ...
 - 实现自己的shell--MIT xv6 shell
			
参考代码: #include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <fcnt ...
 - feignClient传参(参数为对象类型)的一个坑
			
客户端 @RequestMapping(value = "/friendCircleComment/comment",method = RequestMethod.POST) R ...
 - 【mySQL】left join、right join和join的区别
			
哈,好久没更新文章了,今天来说说关于mySQL那些年的小事.说到mySQL啊,用了挺久的了,但是有个问题一直在困扰着我,就是left join.join.right join和inner join等等 ...
 - docker--container的port映射
			
使用nginx为例 先运行nginx [root@localhost ~]# docker run --name web -d nginx Unable to find image 'nginx:la ...