Разыскивается код сравнения строки с маской

Тема в разделе "WASM.A&O", создана пользователем lamer2k, 21 ноя 2008.

  1. lamer2k

    lamer2k New Member

    Публикаций:
    0
    Регистрация:
    14 май 2006
    Сообщения:
    88
    Ищу сабж, мб кто видел норамльный код на СИ для UNICODE строк или хотя бы для ANSI.
    msdn перерыл весь похоже в наборе API такая функция отсутсвует :dntknw:
     
  2. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    А что такое "сравнения строки с маской" ?
     
  3. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    Partner
    IMHO с использованием символов ? и *
     
  4. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    wildcards ?

    http://www.codeproject.com/KB/string/wildcmp.aspx
    http://www.rohitab.com/discuss/lofiversion/index.php/t22550.html
     
  5. lamer2k

    lamer2k New Member

    Публикаций:
    0
    Регистрация:
    14 май 2006
    Сообщения:
    88
    Partner, спасибо большое, что-то я совсем гуглить разучился :dntknw:
     
  6. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Есть такая функция в Win API - не помню сейчас, посмотрю на работе через пару часов.
     
  7. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    AsmGuru62
    ты уж посмотри, ага.
    кстати если кому надо на делфе со стрингами, могу показать как делал в детстве .D
     
  8. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
  9. lamer2k

    lamer2k New Member

    Публикаций:
    0
    Регистрация:
    14 май 2006
    Сообщения:
    88
    в апи - плохо то, что "A pointer to a null-terminated string of maximum length MAX_PATH that contains the path to be searched"
     
  10. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    lamer2k
    зато её можно глянуть в отладчике ;)
     
  11. lamer2k

    lamer2k New Member

    Публикаций:
    0
    Регистрация:
    14 май 2006
    Сообщения:
    88
    Y_Mur, немного оптимизировав твою идею, получил: "можно глянуть в исходниках винды :)"
    win2k\private\shell\shlwapi\path.c если кому нужно могу скинуть код тут
     
  12. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    lamer2k
    Ещё здесь глянь - это покруче исходников winды будет :)
     
  13. sambd

    sambd New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2007
    Сообщения:
    60
    Вот ф-ция 100% рабочая)

    Код (Text):
    1. BOOL StrValid(IN PCHAR Expression, IN PCHAR Name, IN BOOLEAN IgnoreCase)
    2. {
    3.     USHORT ExpressionPosition , NamePosition;
    4.     PCHAR TempExpression, TempName;
    5.     ULONG eLen = lstrlenA(Expression);
    6.     ULONG nLen = lstrlenA(Name);
    7.     ULONG tExpLen = 0, tNamLen = 0;
    8.  
    9.     ExpressionPosition = 0;
    10.     NamePosition = 0;
    11.     while (ExpressionPosition < (eLen / sizeof(char)) &&    NamePosition < (nLen / sizeof(char)))
    12.     {
    13.         if (Expression[ExpressionPosition] == '*')
    14.         {
    15.             ExpressionPosition++;
    16.             if (ExpressionPosition == (eLen / sizeof(char)))
    17.             {
    18.                 return TRUE;
    19.             }
    20.             while (NamePosition < (nLen / sizeof(char)))
    21.             {
    22.                 tExpLen        =  eLen - (ExpressionPosition * sizeof(char));
    23.                 TempExpression =  (PCHAR)( Expression + ExpressionPosition);
    24.                 tNamLen        =  nLen - (NamePosition * sizeof(char));
    25.                 TempName       =  (PCHAR) (Name + NamePosition);
    26.                 if (StrValid(TempExpression, TempName, IgnoreCase))
    27.                 {
    28.                     return TRUE;
    29.                 }
    30.                 NamePosition++;
    31.             }
    32.         }
    33.         else
    34.         {
    35.            
    36.             if (Expression[ExpressionPosition] == '?' ||
    37.                 ( IgnoreCase &&  RtlUpChar(Expression[ExpressionPosition]) == RtlUpChar(Name[NamePosition])) ||
    38.                 (!IgnoreCase &&  Expression[ExpressionPosition]            == Name[NamePosition]))
    39.             {
    40.                 NamePosition++;
    41.                 ExpressionPosition++;
    42.             }
    43.             else
    44.             {
    45.                 return FALSE;
    46.             }
    47.         }
    48.     }
    49.     if (ExpressionPosition == (eLen / sizeof(char)) &&
    50.         NamePosition == (nLen / sizeof(char)))
    51.     {
    52.         return TRUE;
    53.     }
    54.     return FALSE;
    55. }
     
  14. facelift

    facelift New Member

    Публикаций:
    0
    Регистрация:
    18 ноя 2008
    Сообщения:
    25
    Дык, это... regexp может поможет?
     
  15. facelift

    facelift New Member

    Публикаций:
    0
    Регистрация:
    18 ноя 2008
    Сообщения:
    25
    Код (Text):
    1. #include <boost/regex.hpp>
    2. #include <iostream>
    3.  
    4. void print_captures(const std::string& regx, const std::string& text)
    5. {
    6.    boost::regex e(regx);
    7.    boost::smatch what;
    8.    std::cout << "Expression:  \"" << regx << "\"\n";
    9.    std::cout << "Text:        \"" << text << "\"\n";
    10.    if(boost::regex_match(text, what, e, boost::match_extra))
    11.    {
    12.       unsigned i, j;
    13.       std::cout << "** Match found **\n   Sub-Expressions:\n";
    14.       for(i = 0; i < what.size(); ++i)
    15.          std::cout << "      $" << i << " = \"" << what[i] << "\"\n";
    16.       std::cout << "   Captures:\n";
    17.       for(i = 0; i < what.size(); ++i)
    18.       {
    19.          std::cout << "      $" << i << " = {";
    20.          for(j = 0; j < what.captures(i).size(); ++j)
    21.          {
    22.             if(j)
    23.                std::cout << ", ";
    24.             else
    25.                std::cout << " ";
    26.             std::cout << "\"" << what.captures(i)[j] << "\"";
    27.          }
    28.          std::cout << " }\n";
    29.       }
    30.    }
    31.    else
    32.    {
    33.       std::cout << "** No Match found **\n";
    34.    }
    35. }
    36.  
    37. int main(int , char* [])
    38. {
    39.    print_captures("(([[:lower:]]+)|([[:upper:]]+))+", "aBBcccDDDDDeeeeeeee");
    40.    print_captures("(.*)bar|(.*)bah", "abcbar");
    41.    print_captures("(.*)bar|(.*)bah", "abcbah");
    42.    print_captures("^(?:(\\w+)|(?>\\W+))*$",
    43.       "now is the time for all good men to come to the aid of the party");
    44.    return 0;
    45. }