正则表达式匹配
题目: 请实现一个函数用来匹配包含 ‘.’ 和 '* '正则表达式。模式中的字符 ‘.’ 表示任意一个字符,而 '*'表示它的前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串中所有的字符匹配整个模式,例如,字符串"aaa"与模式"a.a"和"ab * ac * a"匹配但与"aa.a"和"ab * a"均不匹配
每次从字符串中拿出一个字符和模式中的字符去匹配。
假设字符串a表带匹配的字符串,字符串b是模式
如何匹配
1、如果模式b中的字符ch是 ’.’ 那么它可以匹配字符串的任意字符
2、如果模式b中的字符ch不是 ‘.’,而且字符串a中的字符也是ch,那么互相匹配,此时需要接着匹配后面的字符
3、当后面的字符不是 ‘ * ’ 时
如果字符串a中的第一个字符和模式b中第一个字符相匹配,那么两者都向后移,否则返回false
4、当后面的字符为 ’ * ’ 时
可能存在着多种匹配方式;
第一种,模式b向后移动两个字符而字符串a不动,表示匹配0个字符
第二种,字符串a向后移动一个字符,模式b上向后移动两个字符或者保持不变
例子——图解
我们可以用模式 ba*ab 来举例子,画出其非确定优先状态机图,如下:
当匹配进入状态2并且字符串a的字符为’a’时,有两种选择:
1、进入状态3(在模式上向后移动两个字符)
2、回到状态3(模式保存不变)
代码
代码如下:
bool match(char* str,char* pattern)
{
if(str==nullptr || pattern==nullptr)
return false;
return matchCore(str,pattern);
}
bool matchCore(char* str,char* pattern)
{
if(*str=='\0' && *pattern=='\0')
return true;
if(*str!='\0' && *pattern=='\0')
return false;
if(*(pattern+1)=='*')
{
if(*pattern==*str || (*pattern=='.' && *str!='\0'))
//移动到下一个状态
return matchCore(str+1,pattern+2)
//停留在当前状态
|| matchCore(str+1,pattern)
//忽略一个 '*'
|| macthCore(str,pattern+2);
else
return matchCore(str,pattern+2);
}
if(*str==*patter || (*pattern=='.' && *str!='\0'))
return matchCore(str+1,pattern+1);
return false;
}