MQLArticles/Utils/StrMatch/StrSimpleMatch.mqh

123 lines
3.7 KiB
MQL5
Raw Permalink Normal View History

2026-03-27 09:40:26 -05:00
//+------------------------------------------------------------------+
//| 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