正则表达式匹配

思路:从前向后匹配,匹配成功的条件是字符串与模式的两个指针都移动到末尾:

(1)若当前字符与模式当前字符匹配:

     a. 若模式当前字符之后跟的不是'*',那么字符串与模式同时移动一位指针;

     b. 若模式当前字符之后跟的是'*',需要分为三种情况,只要有一种匹配成功即可:字符串指针不移动&模式指针移动两位;字符串指针移动一位&模式指针不移动;字符串指针移动一位&模式指针移动两位。

(2)若当前字符与模式当前字符不匹配并且模式当前字符后面跟的是'*':字符串指针不移动&模式指针移动两位。

(3)以上情况都不满足,返回false,检测完毕。

public static boolean matchCore(char[] str,int strStart, char[] pattern, int patternStart){
        //字符串与模式的剩余未匹配长度
        int strNotMatchLength=str.length-strStart;
        int patternNotMatchLength=pattern.length-patternStart;

        //字符串与模式都遍历结束
        if(strNotMatchLength<=0&&patternNotMatchLength<=0) return true;
        //字符串结束,模式有剩余,仅当模式剩余的是若干个"c*"才可能匹配
        if(strNotMatchLength<=0&&patternNotMatchLength>0){
            if(patternNotMatchLength>1&&pattern[patternStart+1]=='*'){
                return  matchCore(str,strStart,pattern,patternStart+2);
            }
            return false;
        }
        //字符串有剩余,模式无剩余
        if(strNotMatchLength>0&&patternNotMatchLength<=0) return false;
        //字符串与模式都有剩余,
        //当前字符与模式当前字符匹配,后面是'*'分三种情况,不是'*'一种情况
        if(str[strStart]==pattern[patternStart]||pattern[patternStart]=='.'){
            if(patternStart+1<pattern.length&&pattern[patternStart+1]=='*'){
                return matchCore(str,strStart,pattern,patternStart+2)||matchCore(str,strStart+1,pattern,patternStart)|| matchCore(str,strStart+1,pattern,patternStart+2);
            }
            return  matchCore(str,strStart+1,pattern,patternStart+1);
        }
        //当前字符与模式当前字符不匹配,后面是'*'一种情况
        else if(patternStart+1<pattern.length&&pattern[patternStart+1]=='*'){
            return  matchCore(str,strStart,pattern,patternStart+2);
        }
        return false;
    }

    public static boolean match(char[] str, char[] pattern){
        if(str==null||pattern==null) return false;
        return matchCore(str,0,pattern,0);
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值