/*******************************
功能:在查找文件時調用匹配
輸入參數:
@cfilename: 需要匹配的文件名
@ckey: 匹配關鍵字(正則表達式)
1、 * 格式(字符串匹配)
2、 ?格式(單個字符匹配)
(注意,此關鍵字中不含有連續的'*')
@bflag: 是否忽略大小寫
返回值: true 匹配成功, false 不匹配
*******************************/
bool MatchKey( const char* cfilename, const char* ckey, bool bflag )
{
bool bMatched = false;
char key[36] = "";
char filename[MAX_PATH] = "";
strncpy( key, ckey,36 );
strncpy( filename, cfilename, MAX_PATH);
if ( bflag )
{
strupr( key );
strupr( filename);
}
//特殊關鍵字匹配
if ( 0 == strcmp( key, "*" ) )
{
//printf("%s -- %s 匹配/n", filename, key);
return true;
}
else if ( 0 == strcmp( key, "*?" )
|| 0 == strcmp( key, "?*" ) )
{
if ( strlen(filename) > 0 )
{
//printf("%s -- %s 匹配/n", filename, key);
return true;
}
else
{
//printf("%s -- %s 不匹配/n", filename, key);
return false;
}
}
else if ( 0 == strcmp( key, "?*?" )
|| 0 == strcmp( key, "*??" ) )
{
if ( strlen(filename) > 1 )
{
//printf("%s -- %s 匹配/n", filename, key);
return true;
}
else
{
//printf("%s -- %s 不匹配/n", filename, key);
return false;
}
}
///普通匹配
const char* pname = filename;
const char* pkey = key;
while( *pname && *pkey )
{
if ( *pkey == '*' )
{
pkey++;
if ( !*pkey )
{
bMatched = true;
break;
}
}
else if ( *pkey == '?' )
{
pkey++;
pname++;
}
else if ( *pkey == *pname )
{
pkey++;
pname++;
}
else
{
if ( *(pkey-1) == '*' )
{
pname++;
}
else
{
break;
}
}
// 判斷下一個的狀況
//匹配完畢
if ( ( !*pname && !*pkey ) )
{
bMatched = true;
break;
}
if ( !*pname || !*pkey ) //是否有一個爲末尾
{
break;
}
}
/////打印匹配信息
//{
// char* info = NULL;
// if ( bMatched )
// info = "匹配";
// else
// info = "不匹配";
// printf( "%s -- %s : %s /n", filename, key, info );
//}
return bMatched;
}