正则表达式匹配

该博客主要探讨了如何实现一个匹配包括'.‘和’‘的正则表达式的函数。通过两个不同的解题思路,一是按照是否相等进行判断,二是按照是否有'*'进行分类,详细解释了匹配过程中的各种情况,包括字符相等、不等以及'*'的处理。解题方法涉及到递归和字符串比较,对于理解正则表达式匹配原理有很好的启示作用。
摘要由CSDN通过智能技术生成

1、题目

请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配

2、解题1

按照是否相等进行判断分类

class Solution {
public:
    bool match(char* str, char* pattern)
    {
        if(str == NULL || pattern == NULL)return false;
        char one = '\0';
        bool flag = JudgeMatch(str,pattern,one,0);
        return flag;
    }
    bool JudgeMatch(char* str,char* pattern,char one,int pos){
        if(pos < 0)return false;
        if(*str == '\0' && *pattern == '\0')return true;
        if(*pattern == '\0')return false;
        if(*str == '\0'){
            //不回退的情况
            bool flag = true;
            bool has = false;
            if(*pattern != '*'){
                pattern++;
            }else{
                has = true;
            }
            if(*pattern != '*')flag = false;
            while(*pattern != '\0' && *pattern == '*')pattern++;
            if(*pattern != '\0'){
                if(flag == true){
                    flag = false;
                }
            }
            if(flag == true)return true;
            if(has == false)return false;
            //回退的情况
            char tmp = '\0';
            return JudgeMatch(str-1,pattern,tmp,pos-1);
        }
        //不等情况
        if(*pattern != *str){
            //都是字母的情况
            if(*pattern != '.' && *pattern != '*'){
                char *tmpLast = pattern+1;
                //后面没有*情况
                if(*tmpLast != '*')return false;
                char tmp = '\0';
                return JudgeMatch(str,tmpLast+1,tmp,pos);
            }
            if(*pattern == '.'){
                char tmp = *pattern;
                return JudgeMatch(str+1,pattern+1,tmp,pos+1);
            }
            //处理pattern带*的情况,不等的情况
            if(one != '.' && one != *str){
                char tmp = '\0';
                return JudgeMatch(str,pattern+1,tmp,pos);
            }
            //处理相等的情况
            //1,*代表多个字符
            bool flag = JudgeMatch(str+1,pattern,one,pos);
            //2,*代表1个字符
            if(flag == false){
                char tmp = '\0';
                char *tmpPattern = pattern;
                while(*tmpPattern != '\0' && *tmpPattern == '*')tmpPattern++;
                flag = JudgeMatch(str,tmpPattern,tmp,pos);
            }
            //3,*代表0个字符
            if(flag == false){
                char tmp = '\0';
                char *tmpPattern = pattern;
                while(*tmpPattern != '\0' && *tmpPattern == '*')tmpPattern++;
                flag = JudgeMatch(str-1,tmpPattern,tmp,pos-1);
            }
            return flag;
        }else{
            //相等的情况
            char tmp = *pattern;
            return JudgeMatch(str+1,pattern+1,tmp,pos+1);
        }
    }
};

3、解题2(简化)

按照是否有*进行判断分类

class Solution {
public:
    bool match(char* str, char* pattern)
    {
        if(str == NULL || pattern == NULL)return false;
        bool flag = JudgeMatch(str,pattern);
        return flag;
    }
    bool JudgeMatch(char* str,char* pattern){
        if(*str == '\0' && *pattern == '\0')return true;
        if(*pattern == '\0')return false;
        if(*(pattern+1) == '*'){
            if(*pattern == *str  || (*str != '\0' && *pattern == '.')){
                return JudgeMatch(str+1,pattern) || JudgeMatch(str,pattern+2);;
            }else{
                return JudgeMatch(str,pattern+2);
            }
        }else{
            //相等的情况
            if(*pattern == *str || (*str != '\0' && *pattern == '.')){
                return JudgeMatch(str+1,pattern+1);
            }else{
                //不等的情况
                return false;
            }
        }
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值