SRC: * and ? pattern matcher
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 30.08.02 10:10
Оценка: 139 (18) :)
Вот, вырезал из одного из своих ранних постов:


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
Re: SRC: * and ? pattern matcher
От: Gorik Россия  
Дата: 31.08.02 06:49
Оценка:
Крут, а пред ним сынки...
Фарш невозможно провернуть назад (с)Второе начало термодинамики
Re: SRC: * and ? pattern matcher
От: Proph  
Дата: 02.09.02 06:24
Оценка:
Здравствуйте 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.
Re: SRC: * and ? pattern matcher
От: OlegO Россия http://www.mediachase.ru
Дата: 27.07.04 07:52
Оценка: 1 (1)
Здравствуйте, 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++;
            }
        }
С уважением, OlegO.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.