不同正则库使用的引擎以及自动机DFA/NFA

本文介绍了正则表达式引擎的两类主要类型:DFA(确定性有穷自动机)和NFA(非确定性有穷自动机)。DFA在性能上较快,但特性较少;NFA虽然速度较慢,但功能丰富,广泛应用在Perl、Ruby、Python等语言的正则库中。NFA支持lazy、backreference等特性,但可能会导致回溯性能问题。C/C++的glibc使用DFA/NFA混合,而PCRE使用传统NFA。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

正则表达式引擎分成两类,一类称为DFA(确定性有穷自动机)Deterministic Finite Automation,另一类称为NFA(非确定性有穷自动机)。两类引擎要顺利工作,都必须有一个正则式和一个文本串,一个捏在手里,一个吃下去。DFA捏着文本串去比较正则式,看到一个子正则式,就把可能的匹配串全标注出来,然后再看正则式的下一个部分,根据新的匹配结果更新标注。而NFA是捏着正则式去比文本,吃掉一个字符,就把它跟正则式比较,匹配就记下来:“某年某月某日在某处匹配上了!”,然后接着往下干。一旦不匹配,就把刚吃的这个字符吐出来,一个个的吐,直到回到上一次匹配的地方。
DFA与NFA机制上的不同带来5个影响:
1. DFA对于文本串里的每一个字符只需扫描一次,比较快,但特性较少;NFA要翻来覆去吃字符、吐字符,速度慢,但是特性丰富,所以反而应用广泛,当今主要的正则表达式引擎,如Perl、Ruby、Python的re模块、Java和.NET的regex库,都是NFA的。
2. 只有NFA才支持lazy和backreference等特性;
3. NFA急于邀功请赏,所以最左子正则式优先匹配成功,因此偶尔会错过最佳匹配结果;DFA则是“最长的左子正则式优先匹配成功”。
4. NFA缺省采用greedy量词;
5. NFA可能会陷入递归调用的陷阱而表现得性能极差。

 

正则表达式引擎所使用的两种基本技术:非确定型有穷自动机(NFA)和确定型有穷自动机(DFA)。

NFA是基于表达式的(Regex-Directed),去匹对相配文档(文档作为有穷字母表Σ),而DFA是基于文本的(Text-Directed),去匹对相配正则表达式。

目前的主流正则引擎又分为3类:一、DFA,二、传统型NFA,三、POSIX NFA。


DFA:

DFA 引擎在线性时状态下执行,因为它们不要求回溯(并因此它们永远不测试相同的字符两次)。DFA 引擎还可以确保匹配最长的可能的字符串。但是,因为 DFA 引擎只包含有限的状态,所以它不能匹配具有反向引用的模式;并且

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值