Last active
February 24, 2022 13:03
-
-
Save Vladimir-Novick/f9e5531ad47be6d7bdc905a234a51c39 to your computer and use it in GitHub Desktop.
Algorithm for WildCard Pattern Searching
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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()); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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()); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
A far more efficient and robust C++ wildcard pattern matching implementation can be found here:
https://www.partow.net/programming/wildcardmatching/index.html