Ищу сабж, мб кто видел норамльный код на СИ для UNICODE строк или хотя бы для ANSI. msdn перерыл весь похоже в наборе API такая функция отсутсвует
wildcards ? http://www.codeproject.com/KB/string/wildcmp.aspx http://www.rohitab.com/discuss/lofiversion/index.php/t22550.html
AsmGuru62 ты уж посмотри, ага. кстати если кому надо на делфе со стрингами, могу показать как делал в детстве .D
в апи - плохо то, что "A pointer to a null-terminated string of maximum length MAX_PATH that contains the path to be searched"
Y_Mur, немного оптимизировав твою идею, получил: "можно глянуть в исходниках винды " win2k\private\shell\shlwapi\path.c если кому нужно могу скинуть код тут
Вот ф-ция 100% рабочая) Код (Text): BOOL StrValid(IN PCHAR Expression, IN PCHAR Name, IN BOOLEAN IgnoreCase) { USHORT ExpressionPosition , NamePosition; PCHAR TempExpression, TempName; ULONG eLen = lstrlenA(Expression); ULONG nLen = lstrlenA(Name); ULONG tExpLen = 0, tNamLen = 0; ExpressionPosition = 0; NamePosition = 0; while (ExpressionPosition < (eLen / sizeof(char)) && NamePosition < (nLen / sizeof(char))) { if (Expression[ExpressionPosition] == '*') { ExpressionPosition++; if (ExpressionPosition == (eLen / sizeof(char))) { return TRUE; } while (NamePosition < (nLen / sizeof(char))) { tExpLen = eLen - (ExpressionPosition * sizeof(char)); TempExpression = (PCHAR)( Expression + ExpressionPosition); tNamLen = nLen - (NamePosition * sizeof(char)); TempName = (PCHAR) (Name + NamePosition); if (StrValid(TempExpression, TempName, IgnoreCase)) { return TRUE; } NamePosition++; } } else { if (Expression[ExpressionPosition] == '?' || ( IgnoreCase && RtlUpChar(Expression[ExpressionPosition]) == RtlUpChar(Name[NamePosition])) || (!IgnoreCase && Expression[ExpressionPosition] == Name[NamePosition])) { NamePosition++; ExpressionPosition++; } else { return FALSE; } } } if (ExpressionPosition == (eLen / sizeof(char)) && NamePosition == (nLen / sizeof(char))) { return TRUE; } return FALSE; }
Код (Text): #include <boost/regex.hpp> #include <iostream> void print_captures(const std::string& regx, const std::string& text) { boost::regex e(regx); boost::smatch what; std::cout << "Expression: \"" << regx << "\"\n"; std::cout << "Text: \"" << text << "\"\n"; if(boost::regex_match(text, what, e, boost::match_extra)) { unsigned i, j; std::cout << "** Match found **\n Sub-Expressions:\n"; for(i = 0; i < what.size(); ++i) std::cout << " $" << i << " = \"" << what[i] << "\"\n"; std::cout << " Captures:\n"; for(i = 0; i < what.size(); ++i) { std::cout << " $" << i << " = {"; for(j = 0; j < what.captures(i).size(); ++j) { if(j) std::cout << ", "; else std::cout << " "; std::cout << "\"" << what.captures(i)[j] << "\""; } std::cout << " }\n"; } } else { std::cout << "** No Match found **\n"; } } int main(int , char* []) { print_captures("(([[:lower:]]+)|([[:upper:]]+))+", "aBBcccDDDDDeeeeeeee"); print_captures("(.*)bar|(.*)bah", "abcbar"); print_captures("(.*)bar|(.*)bah", "abcbah"); print_captures("^(?:(\\w+)|(?>\\W+))*$", "now is the time for all good men to come to the aid of the party"); return 0; }