C语言之实现正则1

利用C语言实现正则表达式1

此正则表达式只包括‘?’和‘*’

正则的匹配规则:

  1.     '?' 可以匹配任意单字符
  2.     '*' 可以匹配任意数的任意字符

    例:
        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),匹配成功
       
        
        
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值