不到1000行的正则表达式代码分析07

165 篇文章 0 订阅
21 篇文章 0 订阅

不到1000行的正则表达式代码分析07
早晨先翻开ruby0.49下的regex.c,发现还是头大,因为太长了,而且逻辑太复杂,比oz的复杂了不止一个数量级。于是仍旧回到oz的grep.c下的正则引擎源码。
昨天在睡觉时,一直在想,grep.c的正则引警是NFA,因为匹配时是正则表达式作主导,而ruby0.49中正则引擎是DFA的,我没有细看代码,但名字叫DFA,应该就是文本主导的,确定型自动机算法。
昨天对NFA的匹配逻辑仍有些模糊之处。
比如"fo[0-9]*ab"是如何实现的?
今天再打开re_pmathch,其流程如下:
static char *
pmatch(char *lp,CHAR *ap)
{
    while((op=*ap++) !=END)
        switch(op) {

        case CLO:
            are=lp;
            switch(*ap) {

            }
            ap+=n;
            while(lp>=are) {
                if (e=pmatch(lp,ap))
                    return 3;
                --lp;
            }
        }
    
}
对其中的lp>=are的那个循环始终不理解,后来灵机一动,那个《精通正则表达式》一书不是讲,NFA的匹配原理时,讲过回溯吗,此处,应该就是回溯。
象用"fo.+[0-9][0-9]"去匹配"this is abcdefg 12"
此时,".*"是能匹配到行末的2的,但此时,[0-9]就无法匹配了,因此,要吐出一个来,先把2吐出,让[0-9]匹配,但第二个[0-9]仍旧无法匹配,因此,要再吐出一个,走到[0-9][0-9]匹配”12“,哈哈,此处,应该是干这事儿的。
到此,基本把nfa的匹配算法读懂了。
但dfa仍旧不懂。先在网上找找资料。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值