在C中实现通配符匹配的思路

Ideas for implementing wildcard matching in C

我正在研究编写一个程序,该程序接受文本和一些通配符模式,然后显示与这些通配符匹配的单词。通配符模式只包含 .,它只代表一个字符,或者 *,它可以是任何东西(包括白色 space,换行符或 ?!,./\ 等) .

到目前为止,我设法动态阅读了文本,并且正在考虑使用 strtok 创建一个包含所有单词的列表。只有 .,这很容易,但我不知道如何使用 *。当然,表达式可以是 .* 的组合,例如:h.*.(例如可以匹配 harry)。

我希望你能与我分享一些想法。我不是要明确的完整代码,而是要我自己实现它的想法。

有一个 2001 IOCCC one-liner (schweikh, ahem) 用 * 表示 "zero or more characters" 和 ? 表示 "exactly one character"。

弄清楚它是如何工作的可能很有启发性,会给你很多想法。

看看 flex 和 bison。他们应该帮助您标记化然后解析正则表达式。从那里执行匹配应该相当容易。

这是一个非常简单的实现:

int WildcardCompare(const char* wild, const char* string) 
{
    const char* cp = NULL, *mp = NULL;
    
    while ((*string) && (*wild != '*')) 
    {
        if ((*wild != *string) && (*wild != '?')) 
        {
            return 0;
        }
        wild++;
        string++;
    }
        
    while (*string) 
    {
        if (*wild == '*') 
        {
            if (!*++wild) 
            {
                return 1;
            }
            mp = wild;
            cp = string+1;
        } 
        else if ((*wild == *string) || (*wild == '?')) 
        {
            wild++;
            string++;
        } 
        else 
        {
            wild = mp;
            string = cp++;
        }
    }
        
    while (*wild == '*') 
    {
        wild++;
    }
    return !*wild;
}