//+------------------------------------------------------------------+ //| StrSimpleMatch.mqh | //| Copyright 2026, Niquel Mendoza. | //| https://www.mql5.com/es/users/nique_372 | //+------------------------------------------------------------------+ #property copyright "Copyright 2026, Niquel Mendoza." #property link "https://www.mql5.com/es/users/nique_372" #property strict #ifndef MQLARTICLES_UTILS_STRMATCH_STRSIMPLEMATCH_MQH #define MQLARTICLES_UTILS_STRMATCH_STRSIMPLEMATCH_MQH //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class CSimpleStringMatch { public: CSimpleStringMatch(void) {} ~CSimpleStringMatch(void) {} //--- // Comprubea si un string sigue cierto patron // el string pattern puede tener los siguientes caracteres: // - ?: Indica que debe de haber un caracter (Cualquier cosa) // - *: Indica que debe de haber todo tipo de caracteres hasta cierto valor, si no se espficia se enetide que toda la cadena por lo tanto true // - ^: Indica que debe de haber un caracter (solo digitos del 0 al 9) // Ahora mencionar que todos esos patrones se pueden combinar para formar el string pattern eg "*.png" // Otra cosa importante es que si en el string pattern luego del * hay un caracter este se toma como "finalizador" asi que "**" // Se buscaria strings de este tipo "hola*" y el pattenr "**" // Retorna true si el string analizado coindice con el patron de lo contrario false static bool SimpleMatchInString(const string& str, const string& pattern); }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ static bool CSimpleStringMatch::SimpleMatchInString(const string& str, const string& pattern) { const int len = StringLen(str); const int lenp = StringLen(pattern); int pos_str = 0, pos_p = 0, pi = 0; while(pos_str < len) { if(pos_p < lenp && str[pos_str] == pattern[pos_p]) { pos_p++; pi++; pos_str++; continue; } //--- Todo (astericos) if(pattern[pos_p] == '*') { if(pos_p < lenp - 1) { pos_p++; while(pos_str < len) { if(str[pos_str] == pattern[pos_p]) { break; } pos_str++; } } else pos_str = len; pi++; continue; } //--- Cualquier caracter //?? //aa if(pattern[pos_p] == '?') { pos_p++; pos_str++; const bool superated_p = pos_p >= lenp; if(pos_str < len && superated_p) return false; // pi++; if(superated_p) break; continue; } //--- Solo numeros (0-9) #define IsDigit(c) ((c ^ '0') <= 9) if(pattern[pos_p] == '^') { pos_p++; if(!IsDigit(str[pos_str])) return false; // Este caracter no es un digito pos_str++; const bool superated_p = pos_p >= lenp; if(pos_str < len && superated_p) return false; // pi++; if(superated_p) break; continue; } #undef IsDigit // IsDigit //--- Fallo //Print("no"); return false; } //Print("pi: ", pi, " lep: ", lenp); return pi == lenp || (lenp > 0 && pattern == "*"); } //+------------------------------------------------------------------+ #endif // MQLARTICLES_UTILS_STRMATCH_STRSIMPLEMATCH_MQH