正则表达式匹配

题目:请实现一个函数用来匹配包含'.'和‘*'的正则表达式.模式中的字符'.'表示任意一个字符,而‘*’表示它前面的字符可以出现任意次(含0次).在本题中,匹配是指字符串的所有字符匹配整个模式.例如,字符串“aaa"与模式“a.a"和"ab*ac*a"匹配,但与"aa.a"及"ab*a"均不匹配。
每次从字符串里拿出一个字符和模式中的字符去匹配.先来分析如何匹配一个字符.如果模式中的字符ch是'.',那么它可以匹配字符串中的任意字符.如果模式中的字符ch不是'.'而且字符串中的字符也是ch,那么它们互相匹配.当字符串中的字符和模式中的字符相互匹配时,接着匹配后面的字符.
相对而言当模式中的第二个字符不是'*'时问题要简单的很多.如果字符串中的第一个字符和模式中的第一个字符相匹配,那么在字符串和模式上都向后移动一个字符,然后匹配剩余的字符串和模式.如果字符串中的第一个字符和模式中的第一个字符不相匹配,则直接返回false.
                                       
   图中 模式ba*ab的非确定有限状态机.当匹配进入状态2并且字符串的字符是'a'时,有两个选择:可以进入状态3,也可以回到状态2
当模式中的第二个字符是'*'时问题要复杂一些,因为可能有多种不同的匹配方式.一个选择是在模式上向后移动两个字符.这相当于'*'和它前面的字符被忽略掉了,因为'*'可以匹配字符串中的0个字符.如果模式中的第一个字符和字符串中的第一个字符相匹配时,则在字符串向后移动一个字符,而在模式上有两个选择:我们可以在模式上向后移动两个字符,也可以保持模式不变.
如图所示,当匹配进入状态2并且字符串的字符是'a'时,我们有两个选择:可以进入状态3(在模式上向后移动两个字符),也可以回到状态2(模式保持不变)
根据上述分析,可以写出如下代码:
 1 bool match(char* str,char* pattern)
 2 {
 3  if(str==NULL||pattern==NULL)
 4  return false;
 5  return matchCore(str,pattern);
 6  }
 7 
 8  bool matchCore(char* str,char* pattern)
 9  {
10   if(*str=='\0'&&*pattern=='\0')
11   return true;
12   if(*str!='\0'&&*pattern=='\0')
13   return false;
14   if(*(pattern+1)=='*')
15   {
16    if(*pattern==*str||(*pattern=='.'&&*str!='\0'))
17    return matchCore(str+1,pattern+2)||matchCore(str+1,pattern)||matchCore(str,pattern+2);
18                   //move on the next state      //stay on the current state      //ignore a'*'
19    else  //ignore a'*'
20    return matchCore(str,pattern+2);
21    }
22   if(*str==*pattern||(*pattern=='.'&&*str!='\0'))
23   return matchCore(str+1,pattern+1);
24   return false;
25 }

 

posted on 2016-05-01 09:49  wxdjss  阅读(313)  评论(0编辑  收藏  举报

导航