file name matching with wildcard

前端 未结 7 1662
闹比i
闹比i 2021-01-01 16:14

I need to implement something like my own file system. One operation would be the FindFirstFile. I need to check, if the caller passed something like ., sample*.cpp

7条回答
  •  無奈伤痛
    2021-01-01 16:54

    For wildcard name matching using '*' and '?' try this (if you want to avoid boost, use std::tr1::regex):

    #include 
    #include 
    
    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, "/", "\\/");
    }
    

提交回复
热议问题