Вот, вырезал из одного из своих ранних постов:
bool PatternMatch(const char* s, const char* mask)
{
const char* cp=0;
const char* mp=0;
for (; *s&&*mask!='*'; mask++,s++) if (*mask!=*s&&*mask!='?') return 0;
for (;;) {
if (!*s) { while (*mask=='*') mask++; return !*mask; }
if (*mask=='*') { if (!*++mask) return 1; mp=mask; cp=s+1; continue; }
if (*mask==*s||*mask=='?') { mask++, s++; continue; }
mask=mp; s=cp++;
}
Тут и '?' и '*' работают... То есть если есть строка "test" и шаблон "*t?st*", то приведенная функция это дело найдет (то есть найдет соответствие строки шаблону)...
Пример использования:
PatternMatch("command.com","*and*") // = true
PatternMatch("RSDN","*SDN*") // = true
PatternMatch("no match","*t?st*") // = false
PatternMatch("test","*t?st*") // = true
PatternMatch("toster","*t?st*") // = true
Крут, а пред ним сынки...
Здравствуйте Flamer, Вы писали:
F>Вот, вырезал из одного из своих ранних постов:
[skip]
не я придумал, а где взял не помню
int maskcmp(str, mask)
char *str;
char *mask;
{
if( (str == NULL) || (mask == NULL) )
return (str == mask);
if( (*str == '\0') || (*mask == '\0') )
return (*str == *mask);
if( (*str == *mask ) || (*mask == '?') )
return maskcmp(&str[1], &mask[1]);
if( *mask == '*')
return (maskcmp(&str[1], &mask[1]) || maskcmp(&str[1], mask));
return 0;
}
Пришел, Увидел, ... Наследил.
Proph.
Здравствуйте, Flamer, Вы писали:
F>Вот, вырезал из одного из своих ранних постов:
...
Перевел вашу функцию на C# как есть, т.е. без серьезных изменений и модификаций, может кому упростит жизнь
private bool PatternMatch(string Source, string Mask)
{
char[] strSource = new char[Source.Length + 1];
char[] strMask = new char[Mask.Length + 1];
Source.CopyTo(0,strSource,0,Source.Length);
Mask.CopyTo(0,strMask,0,Mask.Length);
int SourceIndex = 0;
int MaskIndex = 0;
for(;SourceIndex<strSource.Length&&strMask[MaskIndex]!='*';MaskIndex++,SourceIndex++)
if(strMask[MaskIndex]!=strSource[SourceIndex]&&strMask[MaskIndex]!='?')
return false;
int pSourceIndex = 0;
int pMaskIndex = 0;
for(;;)
{
if(strSource[SourceIndex]==0)
{
while(strMask[MaskIndex]=='*')
MaskIndex++;
return strMask[MaskIndex]==0?true:false;
}
if(strMask[MaskIndex]=='*')
{
if (strMask[++MaskIndex]==0)
return true;
pMaskIndex = MaskIndex;
pSourceIndex = SourceIndex + 1;
continue;
}
if(strMask[MaskIndex]==strSource[SourceIndex]||strMask[MaskIndex]=='?')
{
MaskIndex++;
SourceIndex++;
continue;
}
MaskIndex=pMaskIndex; SourceIndex=pSourceIndex++;
}
}