参考自《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";
}

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

被折叠的 条评论
为什么被折叠?



