This is pretty much the same as @nabulke's answer, using C++11 instead of Boost (so be sure to upvote that one too if you like this answer):
#include <regex>
#include <string>
std::regex wildcardToRegex(const std::string& wildcard, bool caseSensitive = true)
{
// Note It is possible to automate checking if filesystem is case sensitive or not (e.g. by performing a test first time this function is ran)
std::string regexString{ wildcard };
// Escape all regex special chars:
regexString = std::regex_replace(regexString, std::regex("\\\\"), "\\\\");
regexString = std::regex_replace(regexString, std::regex("\\^"), "\\^");
regexString = std::regex_replace(regexString, std::regex("\\."), "\\.");
regexString = std::regex_replace(regexString, std::regex("\\$"), "\\$");
regexString = std::regex_replace(regexString, std::regex("\\|"), "\\|");
regexString = std::regex_replace(regexString, std::regex("\\("), "\\(");
regexString = std::regex_replace(regexString, std::regex("\\)"), "\\)");
regexString = std::regex_replace(regexString, std::regex("\\{"), "\\{");
regexString = std::regex_replace(regexString, std::regex("\\{"), "\\}");
regexString = std::regex_replace(regexString, std::regex("\\["), "\\[");
regexString = std::regex_replace(regexString, std::regex("\\]"), "\\]");
regexString = std::regex_replace(regexString, std::regex("\\+"), "\\+");
regexString = std::regex_replace(regexString, std::regex("\\/"), "\\/");
// Convert wildcard specific chars '*?' to their regex equivalents:
regexString = std::regex_replace(regexString, std::regex("\\?"), ".");
regexString = std::regex_replace(regexString, std::regex("\\*"), ".*");
return std::regex(regexString, caseSensitive ? std::regex_constants::ECMAScript : std::regex_constants::icase);
}
bool wildmatch(const std::string& input, const std::string& wildcard)
{
auto rgx = wildcardToRegex(wildcard);
return std::regex_match(input, rgx);
}