利用C语言实现正则表达式1
此正则表达式只包括‘?’和‘*’
正则的匹配规则:
- '?' 可以匹配任意单字符
- '*' 可以匹配任意数的任意字符
例:
src = abceeeeeefwgwfwehg
re = ab*ehg
匹配成功
src = abceeeeeefwgwfwehg
re = *
匹配成功
src = abceeeeeefwgwfwehg
re = *s
匹配失败
src = abcd
re = *?
匹配成功
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
int re_match(char *s, char *d);
int re_star_match(char *s, char *d);
//用来匹配'*'
int re_star_match(char *s, char *d)
{
if((*d=='\0')&&(*(s+1)=='\0'))
return 1;
if((*d=='\0')&&(*(s+1)!='\0'))
return 0;
if(re_star_match(s, d+1))
{
return 1;
}
else
{
return re_match(s+1, d+1);
}
}
int re_match(char *s, char *d)//匹配s和d
{
if ((*s == '\0')&&(*d == '\0'))//如果匹配到结束则成功
{
return 1;
}
else if((*s==*d)||(*s=='?'))
{
return re_match(s+1, d+1);
}
else if(*s == '*')
{
return re_star_match(s, d);
}
else
{
return 0;
}
return 0;
}
int main(int argc, char* argv[])
{
if(argc != 3)//输出需要两个参数,少于两个报错
{
printf("error\n");
return 0;
}
int out = re_match(argv[1], argv[2]);//对参数1,2进行匹配
printf("%d\n", out);//打印1代表匹配成功,返回0失败
}
使用的是递归遍历的思想,逐个字符遍历,令源字符串的当前字符为S,令正则表达式的当前字符为R
情况分为以下几种:
1、当S==R时,说明当前字符匹配成功,则继续匹配下一个字符
例abc和adc,两个字符串中第1个都为a,则继续匹配下一个;
2、当R=='?',此时匹配任意字符,相当于S==R的情况
例?bc和adc,则继续匹配下一个;
3、当R=='*'时,此时有点复杂,进入re_start_match,建议debug会比较清楚一点
例*b和abb,首先递归比较*b和bb,然后比较*b和b,比较*b和'\0',匹配失败,进行re_match(b,b),匹配成功