Skip to content

Instantly share code, notes, and snippets.

@Vladimir-Novick
Last active February 24, 2022 13:03
Show Gist options
  • Save Vladimir-Novick/f9e5531ad47be6d7bdc905a234a51c39 to your computer and use it in GitHub Desktop.
Save Vladimir-Novick/f9e5531ad47be6d7bdc905a234a51c39 to your computer and use it in GitHub Desktop.
Algorithm for WildCard Pattern Searching
bool PgSQL::match(char* pattern, char* line)
{
if (*pattern == '\0' && *line == '\0')
return true;
if (*pattern == '*' && *(pattern + 1) != '\0' && *line == '\0')
return false;
if (*pattern == '?' || *pattern == *line)
return match(pattern + 1, line + 1);
if (*pattern == '*')
return match(pattern + 1, line) || match(pattern, line + 1);
return false;
}
TEST_METHOD(wildcard_match) {
PgSQL pgsql;
bool ret;
ret = pgsql.match("n*ck", "novick");
Assert::AreEqual<bool>(true, ret, L"\"n*ck\", \"novick\" ", LINE_INFO());
ret = pgsql.match("nov?ck*", "novickfornovick");
Assert::AreEqual<bool>(true, ret, L"\"nov?ck*\", \"novickfornovick\" ", LINE_INFO());
ret = pgsql.match("n*k", "nov");
Assert::AreEqual<bool>(false, ret, L"\"g*k\", \"nov\" ", LINE_INFO());
ret = pgsql.match("novic", "novick");
Assert::AreEqual<bool>(false, ret, L"\"novic\", \"novick\" ", LINE_INFO());
ret = pgsql.match("abc*bcd", "abcdhghgbcd");
Assert::AreEqual<bool>(true, ret, L"\"abc*bcd\", \"abcdhghgbcd\" ", LINE_INFO());
ret = pgsql.match("abc*c?d", "abcd");
Assert::AreEqual<bool>(false, ret, L"\"abc*c?d\", \"abcd\" ", LINE_INFO());
ret = pgsql.match("*c*d", "abcd");
Assert::AreEqual<bool>(true, ret, L"\"*c*d\", \"abcd\" ", LINE_INFO());
ret = pgsql.match("*?c*d", "abcd");
Assert::AreEqual<bool>(true, ret, L"\"*?c*d\", \"abcd\" ", LINE_INFO());
}
TEST_METHOD(wildcard_match) {
PgSQL pgsql;
bool ret;
ret = pgsql.match("n*ck", "novick");
Assert::AreEqual<bool>(true, ret, L"\"n*ck\", \"novick\" ", LINE_INFO());
ret = pgsql.match("nov?ck*", "novickfornovick");
Assert::AreEqual<bool>(true, ret, L"\"nov?ck*\", \"novickfornovick\" ", LINE_INFO());
ret = pgsql.match("n*k", "nov");
Assert::AreEqual<bool>(false, ret, L"\"g*k\", \"nov\" ", LINE_INFO());
ret = pgsql.match("novic", "novick");
Assert::AreEqual<bool>(false, ret, L"\"novic\", \"novick\" ", LINE_INFO());
ret = pgsql.match("abc*bcd", "abcdhghgbcd");
Assert::AreEqual<bool>(true, ret, L"\"abc*bcd\", \"abcdhghgbcd\" ", LINE_INFO());
ret = pgsql.match("abc*c?d", "abcd");
Assert::AreEqual<bool>(false, ret, L"\"abc*c?d\", \"abcd\" ", LINE_INFO());
ret = pgsql.match("*c*d", "abcd");
Assert::AreEqual<bool>(true, ret, L"\"*c*d\", \"abcd\" ", LINE_INFO());
ret = pgsql.match("*?c*d", "abcd");
Assert::AreEqual<bool>(true, ret, L"\"*?c*d\", \"abcd\" ", LINE_INFO());
}
@ArashPartow
Copy link

A far more efficient and robust C++ wildcard pattern matching implementation can be found here:

https://www.partow.net/programming/wildcardmatching/index.html

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment