匹配包含.和*的正则表达式
其中.可以匹配任意一个字符。*可以匹配前面一个或多个字符,也可以是0个。参考《剑指 OFFER》写的以下的程序。
bool expr(const char *str,const char *pattern){
if(*str == '\0' && *pattern =='\0')
return true;
//字符串长于pattern匹配的字符串
if(*str !='\0' && *pattern =='\0')
return false;
//规则下一个符号是*号,
if( *(pattern+1) =='*'){
//当前字符与pattern相等的情况;或pattern是. ,可以匹配任意字符情况
if((*str == *pattern) || (*pattern =='.' && *str!='\0' ) ) {
return expr(str + 1, pattern + 2)//匹配下一个字符
|| expr(str+1,pattern)//pattern为.符号,则pattern可以匹配多个字符串
|| expr(str,pattern+2);//忽略*号的匹配
}else{
//忽略*号的匹配
return expr(str,pattern+2);
}
}
//匹配一个字符,如果相等则匹配下一个;如果规则中下一个字符是.,由于.匹配任意字符,可以继续匹配
if( (*str !='\0' && *pattern=='.') || (*str == *pattern) ){
return expr(str+1,pattern+1);
}
//不符合以上规则都return false
return false;
}