单纯实现\*正则表达式的小算法

本文介绍了一种使用递归方法实现的简单正则表达式匹配算法。该算法能够处理模式如a*b来匹配字符串aaaab,并详细解释了匹配过程中的逻辑判断条件。

参考自《labuladong公众号》,实现"a*b"匹配"aaaab"的正则表达式小算法:

#include <iostream>
#include <string>
using namespace std;
//20201210:实现"a*b"匹配"aaaaab"但不匹配"aa"的正则表达式,用递归

bool IsMatch(string instr,string pattern,string lastcha){
    string chxing("*");
    if(pattern[0]==chxing[0] && lastcha.size()>0 && instr[0]==lastcha[0]){
        //*b匹配(a)ab
        lastcha=instr[0];
        instr.erase(instr.begin());
        // return IsMatch(instr,pattern,lastcha);   //*b匹配(a)b
    }else if(pattern[0]==chxing[0] && lastcha.size()>0 && instr[0]!=lastcha[0]){
        //*bc匹配(a)bc,*随着lastcha中止,*中断,用bc匹配bc
        lastcha=instr[0];
        pattern.erase(pattern.begin());
    }else if(pattern[0]==chxing[0] && lastcha.size()<=0){
        //没可能上来就是*b匹配ab,不允许这样的正则表达式
        cout<<"正则表达式格式不正确!"<<"\n";
    }else if(pattern[0]!=chxing[0] && pattern[0]==instr[0]){
        //bc匹配ba
        lastcha=instr[0];
        instr.erase(instr.begin());
        pattern.erase(pattern.begin());
        //c匹配a
    }else if(pattern[0]!=chxing[0] && pattern[0]!=instr[0]){
        //bc匹配ac
        return false;
    }else{}
    if(instr.size()==0 && pattern.size()==1 && pattern[0]==chxing[0]) return true;  //a*匹配aa
    if(instr.size()<=0 && pattern.size()>0)return false;
    else if(instr.size()>0 && pattern.size()<=0) return false;  //要求完全匹配,而不是正则查找
    else if(instr.size()==0 && pattern.size()==0) return true;
    else{}
    return IsMatch(instr,pattern,lastcha);
}
int main(int argc,char *argv[]){
    string instr("aab"),pattern("a*b");
    cout<<instr<<" match "<<pattern<<" ? "<<IsMatch(instr,pattern,"")<<"\n";
    instr="aa";
    pattern="a*b";
    cout<<instr<<" match "<<pattern<<" ? "<<IsMatch(instr,pattern,"")<<"\n";
    instr="aac";
    pattern="a*b";
    cout<<instr<<" match "<<pattern<<" ? "<<IsMatch(instr,pattern,"")<<"\n";
    instr="aabc";
    pattern="a*b";
    cout<<instr<<" match "<<pattern<<" ? "<<IsMatch(instr,pattern,"")<<"\n";
    instr="aa";
    pattern="a*";
    cout<<instr<<" match "<<pattern<<" ? "<<IsMatch(instr,pattern,"")<<"\n";
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值