For wildcard name matching using '*' and '?' try this (if you want to avoid boost, use std::tr1::regex):
#include <boost/regex.hpp>
#include <boost/algorithm/string/replace.hpp>
using std::string;
bool MatchTextWithWildcards(const string &text, string wildcardPattern, bool caseSensitive /*= true*/)
{
// Escape all regex special chars
EscapeRegex(wildcardPattern);
// Convert chars '*?' back to their regex equivalents
boost::replace_all(wildcardPattern, "\?", ".");
boost::replace_all(wildcardPattern, "\*", ".*");
boost::regex pattern(wildcardPattern, caseSensitive ? regex::normal : regex::icase);
return regex_match(text, pattern);
}
void EscapeRegex(string ®ex)
{
boost::replace_all(regex, "", "");
boost::replace_all(regex, "^", "\^");
boost::replace_all(regex, ".", "\.");
boost::replace_all(regex, "$", "\$");
boost::replace_all(regex, "|", "\|");
boost::replace_all(regex, "(", "\(");
boost::replace_all(regex, ")", "\)");
boost::replace_all(regex, "{", "\{");
boost::replace_all(regex, "{", "\}");
boost::replace_all(regex, "[", "\[");
boost::replace_all(regex, "]", "\]");
boost::replace_all(regex, "*", "\*");
boost::replace_all(regex, "+", "\+");
boost::replace_all(regex, "?", "\?");
boost::replace_all(regex, "/", "\/");
}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…