在C

时间:2015-12-01 13:06:26

标签: c regex string strtok

我正在研究编写一个带有文本,一些通配符模式的程序,然后向我显示与那些通配符匹配的单词。通配符模式仅包含.(仅代表一个字符)或*,可以是任何内容(包括空格,新行或?!,./\等)。

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

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

3 个答案:

答案 0 :(得分:3)

有一个2001 IOCCC one-liner(schweikh,ahem)用“{1}}表示”零个或多个字符“和*表示”正好一个字符“。

弄清楚那个人的工作方式可能很有启发性,并为你提供了很多想法。

答案 1 :(得分:1)

这是非常简单的实现:

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;
}

答案 2 :(得分:0)

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