C语言通配符匹配

参考:https://blog.csdn.net/c80486/article/details/6584769

#include <stdio.h>
#include <ctype.h>

/** Defines and Macros */
#define MATCH      1
#define NOT_MATCH  0

/* 匹配一个字符的宏 */
#define MATCH_CHAR(c1,c2,ignore_case)  ( (c1==c2) || ((ignore_case==1) &&(tolower(c1)==tolower(c2))) )

/*  
 * 通配符匹配算法
 * @param src           [i] 字符串
 * @param pattern       [i] 含有通配符( * 或 ? 号)的字符串
 * @param ignore_case   [i] 是否区分大小写,1 表示不区分,  0 表示区分
 * @retval  1           src 匹配 pattern
 * @retval  0           不匹配
 */
int WildCharMatch(char *src, char *pattern, int ignore_case)
{
    int result;
    
    while (*src)
    {
        if (*pattern == '*')
        {   
            /* 如果 pattern 的当前字符是 '*' */
            /* 如果后续有多个 '*', 跳过 */
            while ((*pattern == '*') || (*pattern == '?'))
                pattern++;
            
            /* 如果 '*" 后没有字符了,则正确匹配 */
            if (!*pattern) 
                return MATCH;
            
            /* 在 src 中查找一个与 pattern中'*"后的一个字符相同的字符*/
            while (*src && (!MATCH_CHAR(*src,*pattern,ignore_case)))
                src++;
            
            /* 如果找不到,则匹配失败 */       
            if (!*src) 
                return NOT_MATCH;
            
            /* 如果找到了,匹配剩下的字符串*/
            result = WildCharMatch (src, pattern, ignore_case);
            /* 如果剩下的字符串匹配不上,但src后一个字符等于pattern中'*"后的一个字符 */
            /* src前进一位,继续匹配 */
            while ( (!result) && (*(src+1)) )// && MATCH_CHAR(*(src+1),*pattern,ignore_case) )
                result = WildCharMatch (++src, pattern, ignore_case);
            
            return result;
        }
        else
        {
            /* 如果pattern中当前字符不是 '*' */
            /* 匹配当前字符*/
            if ( MATCH_CHAR(*src,*pattern,ignore_case) || ('?' == *pattern))
            {
                /* src,pattern分别前进一位,继续匹配 */
                return WildCharMatch (++src, ++pattern, ignore_case);
            }
            else
            {
                return NOT_MATCH;
            }
        }
    }
    
  
    /* 如果src结束了,看pattern有否结束*/      
    if (*pattern) 
    {
        /* pattern没有结束*/ 
        /* 如果pattern有最后一位字符且是'*' */        
        if ( (*pattern=='*') && (*(pattern+1)==0) ) 
            return MATCH;
        else
            return NOT_MATCH;
    }
    else
    {
        return MATCH;
    }
}


/*
 * 如下: 如果匹配字符串的首字符(如pattern = "*abc", 其中的a)在待匹配的字符串(如ababd)中有多个时, 
 * 就会匹配失败。原因是移动任意长的逻辑有欠缺。
 */
int main(int argc, const char **argv)
{
    int n;
    
    /* 旧算法匹配失败案例,新算法正常 */ 
    n = WildCharMatch("A-2-101~122 -7.7_t3.txt", "*.txt", 1);    //返回1
    printf("\nresult: %d\n",n);
        
    n = WildCharMatch("hello.txt", "hel*.txt", 1);    //返回1
    printf("\nresult: %d\n",n);
    
    n = WildCharMatch("Aaa.txt","*.txt",1);    //返回1
    printf("\nresult: %d\n",n);

    n = WildCharMatch("Aaaa","a*a",1);   //返回1
    printf("\nresult: %d\n",n);

    n = WildCharMatch("Aaaa","a*a",0);  //返回0
    printf("\nresult: %d\n",n);

    n = WildCharMatch("ABA","a?a",1);  //返回1
    printf("\nresult: %d\n",n);

    n = WildCharMatch("ABAd","a?a",1); //返回0
    printf("\nresult: %d\n",n);


    return 0;
}
 

 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值