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 利用ε ...
随机推荐
- day07作业猜年龄游戏
# 给定年龄,用户可以猜三次年龄 # # 年龄猜对,让用户选择两次奖励 # # 用户选择两次奖励后退出 get_prize_dict = {} # 获取的奖品信息 age = 18 inp_count ...
- HttpClient之HttpContext使用
Multiple request sequences that represent a logically related session should be executed with the sa ...
- 【CF1100F】Ivan and Burgers(线性基,分治)
题意:给定n个数,每个数为c[i],有q个询问,每次询问从第l个到第r个数字的最大xor和 n,q<=5e5,c[i]<=1e6,时限3s 思路:直接线段树维护区间线性基是3个log,会T ...
- 攻防世界 | CAT
来自攻防世界官方WP | darkless师傅版本 题目描述 抓住那只猫 思路 打开页面,有个输入框输入域名,输入baidu.com进行测试 发现无任何回显,输入127.0.0.1进行测试. 发现已经 ...
- python利用eval方法提升dataframe运算性能
eval方法可以直接利用c语言的速度,而不用分配中间数组,不需要中间内存的占用. 如果包含多个步骤,每个步骤都要分配一块内存 import numpy as npimport pandas as pd ...
- 20175213 2018-2019-2 《Java程序设计》第11周学习总结
教材学习内容总结 URL类是java.net包中的一个重要的类,URL的实例封装着一个统一资源定位符(Uniform Resource Locator),使用URL创建对象的应用程序称作客户端程序 U ...
- Majordomo Info VGER.KERNEL.ORG
This is VGER.KERNEL.ORG Majordomo Info The mission of vger.kernel.org is to provide email list servi ...
- 实现自己的shell--MIT xv6 shell
参考代码: #include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <fcnt ...
- linux从head.s到start_kernelstart_kernel之---内核重定位后分析
参考: https://biscuitos.github.io/blog/ARM-BOOT/ zImage 重定位之后实践 zImage 重定位之后,ARM 将 pc 指针指向了重定位 zImage ...
- 107、TensorFlow变量(三)
创建秩为1的张量 # create a rank1 tensor object import tensorflow as tf mystr = tf.Variable(["Hello&quo ...