예제 #1
0
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());
}
예제 #2
0
bool MatchPattern(const std::wstring& str, const std::wstring& pat)
{
    return MatchPatternT(str.c_str(), pat.c_str());
}
예제 #3
0
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());
}
예제 #4
0
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;
}