сравнение строк с шаблоном
От: Аноним  
Дата: 06.09.06 11:44
Оценка:
Привет всем!


вот такая задача!

есть шаблон (как при поиске файлов) "*ABC??FG*.*" например

какие функции есть что бы сравнить строку с этим шаблоном и сказать сравнимо или нет?

функция("*ABC??FG*.*","343ABC99FG776erefe.hh") -> истина, а

функция("*ABC??FG*.*","343ABC9FG776erefe.hh") -> ложь

или все руками писать!

Спасибо!
Re: сравнение строк с шаблоном
От: ilnar Россия  
Дата: 06.09.06 12:00
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Привет всем!



А>вот такая задача!


А>есть шаблон (как при поиске файлов) "*ABC??FG*.*" например


А>какие функции есть что бы сравнить строку с этим шаблоном и сказать сравнимо или нет?


А>функция("*ABC??FG*.*","343ABC99FG776erefe.hh") -> истина, а


А>функция("*ABC??FG*.*","343ABC9FG776erefe.hh") -> ложь


А>или все руками писать!


А>Спасибо!


return 0 if no match
int wildcmp(const char *wild, const char *string) 
{
    const char *cp, *mp;
    
    while ((*string) && (*wild != '*'))
    {
        if ((*wild != *string) && (*wild != '?'))
            return 0;
        
        wild++;
        string++;
    }
    
    while (*string) 
    {
        if (*wild == '*') 
        {
            if (!*++wild)
                return 1;
            
            mp = wild;
            cp = string+1;
        } 
        else if ((*wild == *string) || (*wild == '?')) 
        {
            wild++;
            string++;
        } 
        else 
        {
            wild = mp;
            string = cp++;
        }
        
    }
    
    while (*wild == '*') 
        wild++;
    
    return !*wild;
}
Re: сравнение строк с шаблоном
От: Константин Л. Франция  
Дата: 06.09.06 12:04
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Привет всем!



А>вот такая задача!


А>есть шаблон (как при поиске файлов) "*ABC??FG*.*" например


А>какие функции есть что бы сравнить строку с этим шаблоном и сказать сравнимо или нет?


А>функция("*ABC??FG*.*","343ABC99FG776erefe.hh") -> истина, а


А>функция("*ABC??FG*.*","343ABC9FG776erefe.hh") -> ложь


А>или все руками писать!


А>Спасибо!


regular expressions?
Re: сравнение строк с шаблоном
От: Аноним  
Дата: 06.09.06 12:07
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Привет всем!



А>вот такая задача!


А>есть шаблон (как при поиске файлов) "*ABC??FG*.*" например


А>какие функции есть что бы сравнить строку с этим шаблоном и сказать сравнимо или нет?


А>функция("*ABC??FG*.*","343ABC99FG776erefe.hh") -> истина, а


А>функция("*ABC??FG*.*","343ABC9FG776erefe.hh") -> ложь


А>или все руками писать!


А>Спасибо!



Спасибо за ответы!

я тоже кое что нашел!

/***********************************************************************
** **
** Function : patmat **
** **
** Purpose : Pattern Matching **
** **
** Usage : Pass two string pointers as parameters.The first **
** being a raw string & the second a pattern the raw **
** string is to be matched against.If the raw string **
** matches the pattern,then the function returns a **
** 1,else it returns a 0. **
** **
** e.g patmat("abcdefghi","*ghi") returns a 1. **
** patmat("abcdefghi","??c??f*") returns a 1. **
** patmat("abcdefghi","*dh*") returns a 0. **
** patmat("abcdefghi","*def") returns a 0. **
** **
** The asterisk is a wild card to allow any charac- **
** ters from its first appearance to the next spec- **
** ific character.The character ? is a wild card **
** for only one character in the position it appears.**
** Combinations such as "*?" or "?*" or "**" are **
** illegal for obvious reasons & the functions may **
** goof,though I think it will still work. **
** **
** Author : Sreenath Chary Nov 29 1988 **
** **
** Logic : The only simple way I could devise is to use **
** recursion.Each character in the pattern is **
** taken & compared with the character in the raw **
** string.If it matches then the remaining amount **
** of the string & the remaining amount of the **
** pattern are passed as parameters to patmat again **
** until the end of the pattern.If at any stage **
** the pattern does not match,then we go back one **
** level & at this level if the previous character **
** was a asterisk in the pattern,we hunt again from **
** where we left off,otherwise we return back one **
** more level with a not found & the process goes **
** on till the first level call. **
** **
** Only one character at a time is considered,except **
** when the character is an asterisk.You'll get the **
** logic as the program unfolds. **
** **
***********************************************************************/

int patmat(char *raw,char *pat)
{ int i, slraw;

if ((*pat == '\0') && (*raw == '\0')) /* if it is end of both */
return 1 ; /* strings,then match */
if (*pat == '\0') /* if it is end of only */
return( 0 ) ; /* pat tehn mismatch */
if (*pat == '*') /* if pattern is a '*' */
{ if (*(pat+1) == '\0') /* if it is end of pat */
return 1 ; /* then match */
for(i=0,slraw=strlen(raw);i<=slraw;i++)/* else hunt for match*/
if ((*(raw+i) == *(pat+1)) || /* or wild card */
(*(pat+1) == '?'))
if (patmat(raw+i+1,pat+2) == 1) /* if found,match */
return( 1 ) ; /* rest of pat */
}
else
{ if (*raw == '\0') /* if end of raw then */
return( 0 ) ; /* mismatch */
if ((*pat == '?') || (*pat == *raw)) /* if chars match then */
if (patmat(raw+1,pat+1) == 1) /* try & match rest of it*/
return 1 ;
}
return 0 ; /* no match found */
}
Re: сравнение строк с шаблоном
От: Ubivetz Украина  
Дата: 06.09.06 12:08
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Привет всем!



А>вот такая задача!


А>есть шаблон (как при поиске файлов) "*ABC??FG*.*" например


А>какие функции есть что бы сравнить строку с этим шаблоном и сказать сравнимо или нет?


А>функция("*ABC??FG*.*","343ABC99FG776erefe.hh") -> истина, а


А>функция("*ABC??FG*.*","343ABC9FG776erefe.hh") -> ложь


А>или все руками писать!


А>Спасибо!

Юзай PCRE. В C++ Builder она вообще включена.
Эх, люблю выпить и переспать с кем нибудь!
Но чаще выходит перепить с кем — нибудь и выспаться...
Re[2]: сравнение строк с шаблоном
От: Аноним  
Дата: 06.09.06 12:10
Оценка:
Здравствуйте, Ubivetz, Вы писали:

руками писать!

А>>Спасибо!

U>Юзай PCRE. В C++ Builder она вообще включена.

интересует переносимость на UNIX!
Re[3]: сравнение строк с шаблоном
От: spine Россия http://ruby.inuse.ru
Дата: 06.09.06 12:23
Оценка:
Здравствуйте, Аноним, Вы писали:
А>интересует переносимость на UNIX!

Ну скажем так — эта либа изначально разрабатывалась для работы в nix окружении.
Re: сравнение строк с шаблоном
От: zaufi Земля  
Дата: 06.09.06 13:17
Оценка: 2 (1)
Здравствуйте, Аноним, Вы писали:

А>Привет всем!


А>вот такая задача!

А>есть шаблон (как при поиске файлов) "*ABC??FG*.*" например
А>какие функции есть что бы сравнить строку с этим шаблоном и сказать сравнимо или нет?
А>функция("*ABC??FG*.*","343ABC99FG776erefe.hh") -> истина, а
А>функция("*ABC??FG*.*","343ABC9FG776erefe.hh") -> ложь
А>или все руками писать!

А>Спасибо!

я там видел ты говорил про *nix ... )

#include <fnmatch.h>
#include <iostream>
using namespace std;

int main()
{
    cout << fnmatch("*ABC??FG*.*","343ABC99FG776erefe.hh", FNM_NOESCAPE) << endl;
    cout << fnmatch("*ABC??FG*.*","343ABC9FG776erefe.hh", FNM_NOESCAPE) << endl;
    return 0;
}


0 == match
1 == not match
Re[2]: сравнение строк с шаблоном
От: Аноним  
Дата: 06.09.06 14:11
Оценка:
Здравствуйте, zaufi, Вы писали:

Z>Здравствуйте, Аноним, Вы писали:


А>>Привет всем!


А>>вот такая задача!

А>>есть шаблон (как при поиске файлов) "*ABC??FG*.*" например
А>>какие функции есть что бы сравнить строку с этим шаблоном и сказать сравнимо или нет?
А>>функция("*ABC??FG*.*","343ABC99FG776erefe.hh") -> истина, а
А>>функция("*ABC??FG*.*","343ABC9FG776erefe.hh") -> ложь
А>>или все руками писать!

А>>Спасибо!

Z>я там видел ты говорил про *nix ... )

Z>
Z>#include <fnmatch.h>
Z>#include <iostream>
Z>using namespace std;

Z>int main()
Z>{
Z>    cout << fnmatch("*ABC??FG*.*","343ABC99FG776erefe.hh", FNM_NOESCAPE) << endl;
Z>    cout << fnmatch("*ABC??FG*.*","343ABC9FG776erefe.hh", FNM_NOESCAPE) << endl;
Z>    return 0;
Z>}

Z>


Z>0 == match

Z>1 == not match


Спасибо !!! это то что надо!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.