模拟正则表达式匹配

前端之家收集整理的这篇文章主要介绍了模拟正则表达式匹配前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

递归模拟,当pattern数组中下一个为'*',则递归枚举是匹配到原串的哪个位置

public class Solution {
    private char[] str ;
    private char[] pattern  ;
    public boolean match(char[] str,char[] pattern)
    {
        this.str = str  ;
        this.pattern = pattern ;
        return match(0,0) ;
    }
    private boolean judge(int sPos,int pPos){
        int i = pattern.length-1  ;
        while(i >= pPos){
            if(pattern[i] == '*' || (i+1 < pattern.length && pattern[i+1] == '*')){
                i-- ;
            }else{
                return false ;
            }
        }
        return true;
    }
    private boolean match(int sPos,int pPos){
        if(sPos == str.length){
            return judge(sPos,pPos) ;
        }
        while(sPos < str.length && pPos < pattern.length){
            if(pattern[pPos] == '*'){
                int ne = pPos+1 ;
                while(ne < pattern.length && pattern[ne] == '*')
                    ne++ ;
                if(pattern[pPos-1] == '.'){
                    for(int i = sPos;i <= str.length;i++){
                        if(match(i,ne))return true ;
                    }
                    return false ;
                }
                if(match(sPos,ne))return true ;
                for(int i = sPos;i < str.length && str[i] == pattern[pPos-1];i++){
                    if(match(i+1,ne)){
                        return true ;
                    }
                }
                return false ;
            }else if(pPos+1 < pattern.length && pattern[pPos+1] == '*'){
                pPos++ ;
            }else if(pattern[pPos] == '.'){
                sPos++;
                pPos++ ;
            }else if(str[sPos] == pattern[pPos]){
                sPos++ ;
                pPos++ ;
            }else{
                return false ;
            }
        }
        if(pPos == pattern.length){
            if(sPos < str.length)return false ;
            else return true ;
        }
        return judge(sPos,pPos) ;
    }
}

猜你在找的正则表达式相关文章