我正在研究编写一个带有文本,一些通配符模式的程序,然后向我显示与那些通配符匹配的单词。通配符模式仅包含.
(仅代表一个字符)或*
,可以是任何内容(包括空格,新行或?!,./\
等)。
到现在为止,我设法动态阅读文本,我正在考虑使用strtok创建一个包含所有单词的列表。只有.
,这很容易,但我不知道如何使用*
。当然,表达式可以是.
和*
的组合,如下所示:h.*.
(例如,可以匹配harry
)。
我希望你能和我分享一些想法。我不是要求明确的完整代码,而是要求我自己实现它的想法。
答案 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。他们应该帮助您进行标记化,然后解析正则表达式。从那里开始进行匹配应该相当容易。