正则基础之 nfa引擎匹配原理

正则基础之 nfa引擎匹配原理

ID:3463890

大小:95.12 KB

页数:6页

时间:2017-11-21

正则基础之 nfa引擎匹配原理_第1页
正则基础之 nfa引擎匹配原理_第2页
正则基础之 nfa引擎匹配原理_第3页
正则基础之 nfa引擎匹配原理_第4页
正则基础之 nfa引擎匹配原理_第5页
资源描述:

《正则基础之 nfa引擎匹配原理》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、正则基础之NFA引擎匹配原理不懂正则引擎原理的情况下,同样可以写出满足需求的正则,但是不知道原理,却很难写出高效且没有隐患的正则。所以对于经常使用正则,或是有兴趣深入学习正则的人,还是有必要了解一下正则引擎的匹配原理的。1为什么要了解引擎匹配原理一个个音符杂乱无章的组合在一起,弹奏出的或许就是噪音,同样的音符经过作曲家的手,就可以谱出非常动听的乐曲,一个演奏者同样可以照着乐谱奏出动听的乐曲,但他/她或许不知道该如何去改变音符的组合,使得乐曲更动听。作为正则的使用者也一样,不懂正则引擎原理的情况下,同样可以写出满足需求的正则,但是不知道原理,

2、却很难写出高效且没有隐患的正则。所以对于经常使用正则,或是有兴趣深入学习正则的人,还是有必要了解一下正则引擎的匹配原理的。2正则表达式引擎正则引擎大体上可分为不同的两类:DFA和NFA,而NFA又基本上可以分为传统型NFA和POSIXNFA。DFA Deterministicfiniteautomaton确定型有穷自动机NFANon-deterministicfiniteautomaton 非确定型有穷自动机TraditionalNFAPOSIXNFADFA引擎因为不需要回溯,所以匹配快速,但不支持捕获组,所以也就不支持反向引用和$numb

3、er这种引用方式,目前使用DFA引擎的语言和工具主要有awk、egrep 和lex。POSIXNFA主要指符合POSIX标准的NFA引擎,它的特点主要是提供longest-leftmost匹配,也就是在找到最左侧最长匹配之前,它将继续回溯。同DFA一样,非贪婪模式或者说忽略优先量词对于POSIXNFA同样是没有意义的。大多数语言和工具使用的是传统型的NFA引擎,它有一些DFA不支持的特性:  捕获组、反向引用和$number引用方式;  环视(Lookaround,(?<=…)、(?

4、;  忽略优先量词(??、*?、+?、{m,n}?、{m,}?),或者有的文章叫做非贪婪模式;  占有优先量词(?+、*+、++、{m,n}+、{m,}+,目前仅Java和PCRE支持),固化分组(?>…)。引擎间的区别不是本文的重点,仅做简要的介绍,有兴趣的可参考相关文献。3预备知识3.1 字符串组成对于字符串“abc”而言,包括三个字符和四个位置。3.2占有字符和零宽度正则表达式匹配过程中,如果子表达式匹配到的是字符内容,而非位置,并被保存到最终的匹配结果中,那么就认为这个子表达式是占有字符的;如果子表达式匹配的仅仅是位置,或者匹配的内

5、容并不保存到最终的匹配结果中,那么就认为这个子表达式是零宽度的。占有字符是互斥的,零宽度是非互斥的。也就是一个字符,同一时间只能由一个子表达式匹配,而一个位置,却可以同时由多个零宽度的子表达式匹配。3.3 控制权和传动正则的匹配过程,通常情况下都是由一个子表达式(可能为一个普通字符、元字符或元字符序列组成)取得控制权,从字符串的某一位置开始尝试匹配,一个子表达式开始尝试匹配的位置,是从前一子表达匹配成功的结束位置开始的。如正则表达式:(子表达式一)(子表达式二)假设(子表达式一)为零宽度表达式,由于它匹配开始和结束的位置是同一个,如位置0,

6、那么(子表达式二)是从位置0开始尝试匹配的。假设(子表达式一)为占有字符的表达式,由于它匹配开始和结束的位置不是同一个,如匹配成功开始于位置0,结束于位置2,那么(子表达式二)是从位置2开始尝试匹配的。而对于整个表达式来说,通常是由字符串位置0开始尝试匹配的。如果在位置0开始的尝试,匹配到字符串某一位置时整个表达式匹配失败,那么引擎会使正则向前传动,整个表达式从位置1开始重新尝试匹配,依此类推,直到报告匹配成功或尝试到最后一个位置后报告匹配失败。4      正则表达式简单匹本过程4.1    基础匹配过程 源字符串:abc正则表达式:ab

7、c匹配过程:首先由字符“a”取得控制权,从位置0开始匹配,由“a”来匹配“a”,匹配成功,控制权交给字符“b”;由于“a”已被“a”匹配,所以“b”从位置1开始尝试匹配,由“b”来匹配“b”,匹配成功,控制权交给“c”;由“c”来匹配“c”,匹配成功。此时正则表达式匹配完成,报告匹配成功。匹配结果为“abc”,开始位置为0,结束位置为3。 4.2    含有匹配优先量词的匹配过程——匹配成功(一)(贪婪词)源字符串:abc正则表达式:ab?c量词“?”属于匹配优先量词,在可匹配可不匹配时,会先选择尝试匹配,只有这种选择会使整个表达式无法匹配

8、成功时,才会尝试让出匹配到的内容。这里的量词“?”是用来修饰字符“b”的,所以“b?”是一个整体。匹配过程:首先由字符“a”取得控制权,从位置0开始匹配,由“a”来匹配“a”,匹

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。