forked from nique_372/MQLArticles
123 lines
No EOL
3.7 KiB
MQL5
123 lines
No EOL
3.7 KiB
MQL5
//+------------------------------------------------------------------+
| |
//| 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 |