Wildcards (? и *) matching algorithm

Bacha

которые типа любой символ заменяют и любое кол-во символов соотв.?

AlexV769

wildcards

Bacha

точняк! а теперь нужен алгоритм для их matching )

Bacha

либо функция, чтоб wildcard в regexp pattern переделать, а regexp matching у меня уже есть )

AlexV769

wildcard в regexp pattern
жесть
* -> .*
? -> .

Bacha

а точку надо преобразовывать? и другие говно-символы?

slonishka

. -> \.

AlexV769

говно-символ -> \говно-символ

забыл :)

yolki

список говно-символов прилагается?
\, / - вроде такие..
$ - такой?
& - такой?
<>, [], -?

AlexV769

список говно-символов прилагается?
первая сцылка в гугле:
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".

Vladislav177Rus

Вариант без регекспов
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++;
}
}

Bacha

сам придумал? тестировал его? или скажи откуда взял

bleyman

Только в отличие от регексов он у тебя бэктрекается. Поэтому миллион букв "а" он будет сличать с паттерном "*b" несколько часов. А с паттерном "*a*b" - несколько лет. А с паттерном "*a*a*b" — несколько миллионов лет. Это плохо!
Оставить комментарий
Имя или ник:
Комментарий: