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 利用ε ...
随机推荐
- sql中使一个字段升序,一个字段降序
ORDER BY _column1, _column2; /* _column1升序,_column2升序 */ ORDER BY _column1, _column2 DESC; /* _colum ...
- 理解"__repr__"
class aTest: def __repr__(self): return "This is an aTest class." a = aTest() print (a) cl ...
- Ubuntu新建用户组
新建用户组 sudo addgroup groupname 把现有用户加入新建的用户组 sudo adduser username groupname
- python自动刷新抢火车票
#!/usr/bin/env python #-*- coding: utf-8 -*- """ 火车票 可以自动填充账号密码,同时,在登录时,也可以修改账号密码 然后手 ...
- vue项目中echarts使用渐变效果报错echarts is not defined
解决办法:在当前单组件中在引用一次
- 线性规划(Simplex单纯形)与对偶问题
线性规划 首先一般所有的线性规划问题我们都可以转换成如下标准型: 但是我们可以发现上面都是不等式,而我们计算中更希望是等式,所以我们引入这个新的概念:松弛型: 很显然我们最后要求是所有的约束左边的变量 ...
- Tortoise git账号记住密码
方法一: 本地git仓库目录下,找到 .git/config ,然后打开增加: [credential] helper = store 这样只有该目录下的git操作不用每次输入用户名和密码,换一个目录 ...
- 防止NSTimer和调用对象之间的循环引用
防止NSTimer和调用对象之间的循环引用 @interface NSTimer (EOCBlocksSupport) + (NSTimer *)eoc_scheduledTimerWithTimeI ...
- Asp.Net Core 第07局:路由
总目录 前言 本文介绍Asp.Net Core 路由. 环境 1.Visual Studio 2017 2.Asp.Net Core 2.2 开局 第一手:路由概述 1.路由主要用于处理特定的请求. ...
- 控制banner内容
Spring Boot启动的时候默认的banner是spring的字样,看多了觉得挺单调的,Spring Boot为我们提供了自定义banner的功能. 自定义banner只需要在resource下新 ...