文件名匹配查找

来源:互联网 发布:linux 卸载jdk1.7 编辑:程序博客网 时间:2024/05/22 16:59
/* fn_compare.hpp sdragonx 2015-02-25 14:32:54*/#ifndef FN_COMPARE_HPP_20150225143254#define FN_COMPARE_HPP_20150225143254#include <string>#define _CGL_BEGIN cgl{#define _CGL_END }#define cstring std::basic_string_CGL_BEGIN/* 模糊查找文件名matching 例: bool b = fn_compare("abc.txt", "a?c.*"); sdragonx 2010-09-20 16:01*/template<typename _char_t>bool fn_compare(const cstring<_char_t>& fname, const cstring<_char_t>& findstr){//const static cstring<_char_t> mark = "*?";_char_t mark[4] = { '*', '?' };if(fname.empty() || findstr.empty())    {return false;    }if(findstr.find_first_of(mark) == cstring<_char_t>::npos)    {        return fname.find(findstr) != cstring<_char_t>::npos;    }    else    {        size_t n = 0;        for(size_t i = 0; i<findstr.size(); )        {if(findstr[i] == '*'){i = findstr.find_first_not_of(mark, i);if(i == cstring<_char_t>::npos){return true;}n = fname.find(findstr[i], n);if(n == cstring<_char_t>::npos){return false;}            }            else if(findstr[i] == '?')            {                ++n;                ++i;            }            else            {//while(mark.find(findstr[i]) == cstring<_char_t>::npos)while(findstr[i] != '*' && findstr[i] != '?'){if(!findstr[i]){return true;}else if(fname[n++] != findstr[i++]){                        return false;}}            }        }        return !(n < fname.size());    }}_CGL_END#endif //FN_COMPARE_HPP_20150225143254

0 0