在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;
}
我正在研究编写一个程序,该程序接受文本和一些通配符模式,然后显示与这些通配符匹配的单词。通配符模式只包含 .
,它只代表一个字符,或者 *
,它可以是任何东西(包括白色 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;
}