bool MatchPattern(const base::StringPiece& eval, const base::StringPiece& pattern) { return MatchPatternT(eval.data(), eval.data()+eval.size(), pattern.data(), pattern.data()+pattern.size(), 0, NextCharUTF8()); }
bool MatchPattern(const std::wstring& str, const std::wstring& pat) { return MatchPatternT(str.c_str(), pat.c_str()); }
bool MatchPattern(const string16& eval, const string16& pattern) { return MatchPatternT(eval.c_str(), eval.c_str()+eval.size(), pattern.c_str(), pattern.c_str()+pattern.size(), 0, NextCharUTF16()); }
static bool MatchPatternT(const CHAR* eval, const CHAR* eval_end, const CHAR* pattern, const CHAR* pattern_end, int depth, NEXT next) { const int kMaxDepth = 16; if(depth > kMaxDepth) { return false; } // 跳过所有匹配的字符. EatSameChars(&pattern, pattern_end, &eval, eval_end, next); // 字符串为空时模式串为空或者仅含有通配符. if(eval == eval_end) { EatWildcard(&pattern, pattern_end, next); return pattern == pattern_end; } // 模式串为空而字符串不为空, 匹配失败. if(pattern == pattern_end) { return false; } // 如果是?, 拿当前模式串和剩余字符串或者跳过一个字符的剩余串进行比较. const CHAR* next_pattern = pattern; next(&next_pattern, pattern_end); if(pattern[0] == '?') { if(MatchPatternT(eval, eval_end, next_pattern, pattern_end, depth+1, next)) { return true; } const CHAR* next_eval = eval; next(&next_eval, eval_end); if(MatchPatternT(next_eval, eval_end, next_pattern, pattern_end, depth+1, next)) { return true; } } // 如果是*, 尝试所有可能的子串和剩余的模式串进行匹配. if(pattern[0] == '*') { // 跳过重复的通配符(********** into *)以减少不必要的循环. EatWildcard(&next_pattern, pattern_end, next); while(eval != eval_end) { if(MatchPatternT(eval, eval_end, next_pattern, pattern_end, depth+1, next)) { return true; } eval++; } // 到达字符串末尾, 检查模式串是否只含有通配符. if(eval == eval_end) { EatWildcard(&pattern, pattern_end, next); if(pattern != pattern_end) { return false; } return true; } } return false; }