一道常见的面试题,简易的正则匹配,实现*和?
/*
* 简易正则表达,匹配*和?
* *表示匹配任意个字符
* ?表示匹配一个字符
*/
#include <stdio.h>
#include <stdlib.h>
int ismatch(char* regexp, char* str)
{
//如果匹配的字符串为空
if(*str == '\0')
{
if(*regexp == '\0')
{
return 1;
}
else
{
while(*regexp == '*')
++regexp;
return *regexp == '\0';
}
}
//匹配的字符串不为空,而正则表达式为空
if(*regexp == '\0')
return 0;
//两者都不为空,比较第一个字符
if(*regexp == *str) //如果首字符相同,则比较两者的子串
{
return ismatch(++regexp, ++str);
}
else //如果首字符不同
{
if(*regexp == '?')
{
return ismatch(++regexp, ++str);
}
else if(*regexp == '*') //这个递归是匹配*的核心代码,但是这种写法理解起来很简单,但是存在重复计算
{
return ismatch(regexp, ++str) || ismatch(++regexp, ++str);
}
else
{
return 0;
}
}
}
int main()
{
char reg[256];
char str[256];
int ret;
while(scanf("%s %s", reg, str) != EOF)
{
ret = ismatch(reg, str);
printf("%s\n", ret ? "yes" : "no");
}
}