Wildcards (? и *) matching algorithm
wildcards
точняк! а теперь нужен алгоритм для их matching )
либо функция, чтоб wildcard в regexp pattern переделать, а regexp matching у меня уже есть )
wildcard в regexp patternжесть
* -> .*
? -> .
а точку надо преобразовывать? и другие говно-символы?
. -> \.
говно-символ -> \говно-символ
забыл
\, / - вроде такие..
$ - такой?
& - такой?
<>, [], -?
список говно-символов прилагается?первая сцылка в гугле:
Because we want to do more than simply search for literal pieces of text, we need to reserve certain characters for special use. In the regex flavors discussed in this tutorial, there are 11 characters with special meanings: the opening square bracket [, the backslash \, the caret ^, the dollar sign $, the period or dot ., the vertical bar or pipe symbol |, the question mark ?, the asterisk or star *, the plus sign +, the opening round bracket ( and the closing round bracket ). These special characters are often called "metacharacters".
bool PatternMatch(const char *s, const char *mask)
{
const char *cp = 0;
const char *mp = 0;
// Съедаем маску и строку до первой *, либо до конца
for (; *s && *mask != '*'; mask++, s++) if (*mask != *s && *mask != '?') return 0;
for (;;) {
// Если строка кончилась, то остаток маски должен состоять только из *
if (!*s) { while (*mask == '*') mask++; return !*mask; }
// Если маска начинается с *, съедим * и:
// - если она ей и кончается, то return true
// - иначе запомним, с какой маски и строки начинать, если, исходя из предположения,
// что * совпадает с пустой строкой, мы встретим облом
if (*mask == '*') { if (!*++mask) return 1; mp = mask; cp = s + 1; continue; }
// Съедаем символ в маске и строке, если в маске тот же символ или ?
if (*mask == *s || *mask == '?') { mask++, s++; continue; }
// Символы в маске и строке не совпадают!
// - в случае неудачи в дальнейшем сопоставлении возьмем ту же маску и на 1 короче суффикс
mask = mp; s = cp++;
}
}
сам придумал? тестировал его? или скажи откуда взял
Только в отличие от регексов он у тебя бэктрекается. Поэтому миллион букв "а" он будет сличать с паттерном "*b" несколько часов. А с паттерном "*a*b" - несколько лет. А с паттерном "*a*a*b" — несколько миллионов лет. Это плохо!
Оставить комментарий
Bacha
которые типа любой символ заменяют и любое кол-во символов соотв.?