Форум программистов, компьютерный форум, киберфорум
C/C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
 Аватар для bedvit
1210 / 261 / 22
Регистрация: 20.05.2016
Сообщений: 1,147
Записей в блоге: 22

Реализация LIKE как в VB или SQL на С++ или Си

04.06.2023, 10:06. Показов 12798. Ответов 62
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мое почтение, джентльмены.
Нужна быстрая реализация LIKE как в VB или SQL (алгоритм аналогичный) на С++ или Си.

Из вменяемого нашел только часть алгоритма (ссылка не вставляется, напишу ниже). А так же в Win32 SymMatchString(), которая на порядок медленее чем моя текущая реализация.

Не хочу колхозить свой велосипед, возможно кто-то сможет поделится проверенным алгоритмом.

Добавлено через 11 минут
Из stackoverflow: Как-проверить-соответствие-имени-файла-маске
Маска может содержать:
? - означает 1 любой символ
* - означает 0 или более любых символов
любые другие символы означают сами себя
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool check(char *s, char *p)
{
char *rs=0, *rp;
while(1)
  if(*p=='*')
    rs=s, rp=++p;
  else if(!*s)
    return !*p;
  else if(*s==*p || *p=='?')
    ++s, ++p;
  else if(rs)
    s=++rs, p=rp;
  else
    return false;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.06.2023, 10:06
Ответы с готовыми решениями:

Реализация Round Robin Algoritm, данные должны храниться или в памяти, или на внешнем SQL хранилище
Добрый день Уважаемое сообщество! Порекомендуйте аналог RRDLib на C#. NHawk и другие врапперы к RRDTool не предлагать по причине...

Есть ли в VB или в ADO, DAO или RDO функция преобразования MS SQL типов данных в MS Access?
Существует ли встроенная функция перевода типов данных SQL в Access, Paradox, Dbase и пр.?

Создайте приложение с SQL Server 2012 (или более поздней версии), .NET 4.8 и Entity Framework 6.2 (или 6.4) с по
Привет, мне дали такую задачу и у меня достаточно мало времени, 3-4 дня. Нужно его сделать и одновременно разобраться как это сделать...

62
фрилансер
 Аватар для Алексей1153
6495 / 5723 / 1133
Регистрация: 11.10.2019
Сообщений: 15,284
06.06.2023, 10:42
Студворк — интернет-сервис помощи студентам
bedvit, подправил https://onlinegdb.com/1DArXcTR5
0
 Аватар для bedvit
1210 / 261 / 22
Регистрация: 20.05.2016
Сообщений: 1,147
Записей в блоге: 22
06.06.2023, 11:38  [ТС]
Алексей1153, сделал общий тест: https://onlinegdb.com/VuJWz2F2_
Раскомментируйте остальные строки в тесте, там ваша функция спотыкается.
К сожалению, пока не могу обойти проблему с повторяющейся маской в строке, когда отличие появляется в последних символах, к примеру "ac5c5b" Like "a*[1-56-9][!c-e]" должно быть true. видимо нужен перебор нескольких вариантов, с которых начинаются совпадения в случае спецсимвола *

Добавлено через 1 минуту
Алексей1153, у вас такая же проблема)

Добавлено через 2 минуты
там 3 функции на тестировании, Алексей1153, моя и check с из stackoverflow (которая умеет только * и ?), но полезна в качестве сравнить скорость.

Добавлено через 1 минуту
По скорости:
Speed test...

check, ms: 208

LikeVB, ms: 210

MatchWildcardAndText, ms: 326


Но к сожалению, это только промежуточный результат, т.к. все функции не отрабатывают шаблон без ошибок.
0
фрилансер
 Аватар для Алексей1153
6495 / 5723 / 1133
Регистрация: 11.10.2019
Сообщений: 15,284
06.06.2023, 13:04
bedvit, я кое-что подправил в коде https://onlinegdb.com/FZxuGEFxk

, но для теста
{L"ac5c5b", L"a*[1-56-9][!c-e]", 0}
результат должен быть false, потому что звёздочка у меня не жадная
ac5c5b
a*[1-56-9][!c-e]


кстати, вопрос - она должна быть жадная или нет ?
0
 Аватар для bedvit
1210 / 261 / 22
Регистрация: 20.05.2016
Сообщений: 1,147
Записей в блоге: 22
06.06.2023, 14:11  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
кстати, вопрос - она должна быть жадная или нет ?
VB выдает true https://onlinegdb.com/o78h1o56B
MS SQL тоже (SELECT iif('ac5c5b' Like 'a%[1-56-9][^c-e]','True','False') = True)

Добавлено через 9 минут
Алексей1153, все равно спотыкается на тех строках, которые закоментированы, вы их раскомментируйте.

Добавлено через 28 секунд
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
std::vector < std::vector<const wchar_t* >> testArr =
        {
            {L"XYXZZXY", L"*X*X?",L"True"},         //' Speed test
            {L"aBBBa", L"a*a",L"True"},             
            {L"F" , L"[A-Z]" ,L"True"},             
            {L"F" , L"[!A-Z]",NULL},                
            {L"a2a" , L"a#a", L"True"},             
            {L"aM5b" , L"a[L-P]#[!c-e]", L"True"},  
            {L"BAT123khg" , L"B?T*", L"True"},     
            {L"CAT123khg" , L"B?T*",NULL},          
            {L"ab" , L"a*b",L"True"},               
            {L"a*b" , L"a[*]b", NULL},             
            {L"axxxxxb" , L"a[*]b",NULL},         
            {L"a [xyz" , L"a [[]*", L"True"},       
            {L"aM5b" , L"a*?b", L"True"},             
            {L"aM5b" , L"a*[1-4-9][!c-e]", L"True"},  
            {L"aM55b" , L"a*[1-4-9][!c-e]", L"True"}, 
            {L"aM5b" , L"*#[!c-e]", L"True"},        
            {L"" , L"[]", L"True"},                   
            {L"", L"*", L"True"},                     
            {L"", L"", L"True"},                      
            {L"*", L"", NULL},                    
            {L"5*", L"5[*]", L"True"},                
            {L"?n", L"[?]n", L"True"},
            {L"a", L"[a-cdf]", L"True"},
            {L"b", L"[a-cdf]", L"True"},
            {L"c", L"[a-cdf]", L"True"},
            {L"d", L"[a-cdf]", L"True"},
            {L"f", L"[a-cdf]", L"True"},
            {L"-", L"[-acdf]", L"True"},
            {L"a", L"[-acdf]", L"True"},
            {L"c", L"[-acdf]", L"True"},
            {L"d", L"[-acdf]", L"True"},
            {L"f", L"[-acdf]", L"True"},
            {L"[", L"[ [ ]", L"True"},
            {L"]", L"]", L"True"},
            {L"abc_d", L"abc[_]d*", L"True"},
            {L"abc_de", L"abc[_]d*", L"True"},
            {L"abcd", L"abc[def]", L"True"},
            {L"abce", L"abc[def]", L"True"},
            {L"abcf", L"abc[def]", L"True"},
            {L"abcdef", L"abc*[de]ef", L"True"},
            {L"abcyef", L"abc[xz]ef", NULL},
            {L"abcxef", L"abc[xz]ef", L"True"},
            {L"abcyef", L"abc[!xz]ef", L"True"},
            {L"abcxef", L"abc[!xz]ef", NULL},
            {L"ac5c5b", L"a*[1-56-9][!c-e]", L"True"}
            //{L"a [xyz" , L"a [*", NULL}             //' Throws Error 93 (invalid pattern string).
        };
0
фрилансер
 Аватар для Алексей1153
6495 / 5723 / 1133
Регистрация: 11.10.2019
Сообщений: 15,284
06.06.2023, 14:45
bedvit, остальные строки я не смотрел. Сейчас звёздочка работает неправильно. Я позже поразбираюсь, сейчас не могу

Добавлено через 9 минут
bedvit, я понял, в чём загвоздка - сейчас я добираюсь по маске до определённого момента на строке, остаются лишние символы. В этой ситуации нужно делать возврат на звёздочку и пробовать там забрать ещё один символ. При нескольких звёздочках таких переборов будет много Сейчас я понятия не имею, как это разруливать в один проход. Разве что делать разветвление разбора, складывать в стек. И возвращаться к сложенным вариантам, если строка не совпала

Добавлено через 9 минут
собственно, можно попробовать рекурсию: когда дошли до звезды, вызываем функцию поиска, куда подаём остаток маски (исключая саму звезду) и остаток строки1. Если не сматчилось, меняем подаваемый хвост строки1

1 - тут возможны варианты:
  1) подавать, увеличивая по одному символу.
  2) подавать половинным делением

думаю, второй вариант будет быстрее. И более безопасным в плане переполнения стека
0
 Аватар для bedvit
1210 / 261 / 22
Регистрация: 20.05.2016
Сообщений: 1,147
Записей в блоге: 22
06.06.2023, 15:19  [ТС]
Алексей1153, да, я поэтому и не хотел свой велосипед придумывать Наверняка, это где-то и кто-то делал, проводил тесты в разных сочетаниях, всех возможных, отлавливал ошибки и т.д. Этому функционалу десятки лет.
0
фрилансер
 Аватар для Алексей1153
6495 / 5723 / 1133
Регистрация: 11.10.2019
Сообщений: 15,284
06.06.2023, 22:51
bedvit, сделал рекурсивный вариант https://onlinegdb.com/Lde-z8ozZ
прошёлся ещё статическим анализатором и подправил несколько глупых ошибок с char

Только половинным делением не обойтись, изначально я предполагаю, что звезда хавает всю оставшуюся строку, а если это не удалось, то уменьшаю по одному символу. Иначе тут никак, судя по всему.

Проваленные тесты, с моей точки зрения, просто составлены неверно (инвертирован ожидаемый результат).
Ведь неверных масок тут не может быть. Если квадратная скобка не закрыта, то это обычный символ.
Также, конструкция [1-4-9] раскроется в [12349-].
[*] - это отдельный символ '*' в строке.
Под вопросом для меня только совпадение пустой строки и [].
А остальное всё парсится норм (как я считаю)


Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
ok   :  string  XYXZZXY    LIKE  *X*X?            must be true
ok   :  string  aBBBa      LIKE  a*a              must be true
ok   :  string  F          LIKE  [A-Z]            must be true
ok   :  string  F          LIKE  [!A-Z]           must be false
ok   :  string  a2a        LIKE  a#a              must be true
ok   :  string  aM5b       LIKE  a[L-P]#[!c-e]    must be true
ok   :  string  BAT123khg  LIKE  B?T*             must be true
ok   :  string  CAT123khg  LIKE  B?T*             must be false
ok   :  string  ab         LIKE  a*b              must be true
error:  string  a*b        LIKE  a[*]b            must be false
ok   :  string  axxxxxb    LIKE  a[*]b            must be false
ok   :  string  a [xyz     LIKE  a [[]*           must be true
ok   :  string  aM5b       LIKE  a*?b             must be true
error:  string  aM5b       LIKE  a*[1-4-9][!c-e]  must be true
error:  string  aM55b      LIKE  a*[1-4-9][!c-e]  must be true
ok   :  string  aM5b       LIKE  *#[!c-e]         must be true
error:  string             LIKE  []               must be true
ok   :  string             LIKE  *                must be true
ok   :  string             LIKE                   must be true
ok   :  string  *          LIKE                   must be false
ok   :  string  5*         LIKE  5[*]             must be true
ok   :  string  ?n         LIKE  [?]n             must be true
ok   :  string  a          LIKE  [a-cdf]          must be true
ok   :  string  b          LIKE  [a-cdf]          must be true
ok   :  string  c          LIKE  [a-cdf]          must be true
ok   :  string  d          LIKE  [a-cdf]          must be true
ok   :  string  f          LIKE  [a-cdf]          must be true
ok   :  string  -          LIKE  [-acdf]          must be true
ok   :  string  a          LIKE  [-acdf]          must be true
ok   :  string  c          LIKE  [-acdf]          must be true
ok   :  string  d          LIKE  [-acdf]          must be true
ok   :  string  f          LIKE  [-acdf]          must be true
ok   :  string  [          LIKE  [ [ ]            must be true
ok   :  string  ]          LIKE  ]                must be true
ok   :  string  abc_d      LIKE  abc[_]d*         must be true
ok   :  string  abc_de     LIKE  abc[_]d*         must be true
ok   :  string  abcd       LIKE  abc[def]         must be true
ok   :  string  abce       LIKE  abc[def]         must be true
ok   :  string  abcf       LIKE  abc[def]         must be true
ok   :  string  abcdef     LIKE  abc*[de]ef       must be true
ok   :  string  abcyef     LIKE  abc[xz]ef        must be false
ok   :  string  abcxef     LIKE  abc[xz]ef        must be true
ok   :  string  abcyef     LIKE  abc[!xz]ef       must be true
ok   :  string  abcxef     LIKE  abc[!xz]ef       must be false
ok   :  string  ac5c5b     LIKE  a*[1-56-9][!c-e] must be true
error:  string  a [xyz     LIKE  a [*             must be false
 
errors_count=5
1
 Аватар для bedvit
1210 / 261 / 22
Регистрация: 20.05.2016
Сообщений: 1,147
Записей в блоге: 22
07.06.2023, 00:10  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
Ведь неверных масок тут не может быть. Если квадратная скобка не закрыта, то это обычный символ.
https://learn.microsoft.com/en... e-operator
Здесь пишут, что это ошибка. В своей реализации я делаю throw.
Квадратные скобки экранируют спецсимволы, т.е. если это обычный символ нужно знать это заранее, т.к. после скобки могут идти спецсимволы, их экранировать или нет? Поэтому я экранирую всегда, если не нахожу закрывающую скобку - throw
Цитата Сообщение от Алексей1153 Посмотреть сообщение
Под вопросом для меня только совпадение пустой строки и [].
Это тоже есть по ссылке выше: The character sequence [] is considered a zero-length string ("").
Цитата Сообщение от Алексей1153 Посмотреть сообщение
Также, конструкция [1-4-9] раскроется в [12349-].
В VB конструкция [1-4-9] раскрывается как [1-44-9], или [1-9] т.е [1234456789]. Красным отметил дубликат - под вопросом (это не играет особой роли)
Цитата Сообщение от Алексей1153 Посмотреть сообщение
[*] - это отдельный символ '*' в строке.
Все верно, квадратные скобки экранируют спецсимволы.
0
 Аватар для bedvit
1210 / 261 / 22
Регистрация: 20.05.2016
Сообщений: 1,147
Записей в блоге: 22
07.06.2023, 20:31  [ТС]
Первый вариант, похожий на говнокод, но который проходит проверку тестового набора
Замер времени в сравнении с базовой из топика (которая умеет только ? и *)
Проверка: https://onlinegdb.com/ygawXf-so (вывод ошибок и времени).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
bool LikeVB(const wchar_t* s, const wchar_t* p)
{
    const wchar_t* rs = 0, * rp = 0;
    bool res = 0;//result [...]
 
    while (1) {
        if (*p == L'[') {
            if (*(p + 1) == L']') { p += 2; continue; }// ""=="[]"
            bool b = false, match = false;
            const wchar_t* pt = p; //p_temp
            if (*(++pt) == L'!' && *(pt + 1) != L']') { b = true; ++pt; }//[!...] not [!]
 
            while (*pt != L']') {
                if (*pt == L'\0') { throw 93; }//если забыли закрывающую скобку//' Throws Error 93 (invalid pattern string).
 
                if (*(pt + 1) == L'-' && *(pt + 2) != L']')//если есть диапазон ... - ...
                {
                    if (*s >= *pt && *s <= *(pt + 2))
                    {
                        if (b) {
                            res = false; break;
                        }//если таких символов не должно быть
                        else {
                            match = true;
                        }//если нашли
                    }
                    pt += 2; //for [1-4-9]
                }
                else { //если отдельный символ
                    if (*s == *pt) {
                        if (b) {
                            res = false;  break;
                        }//если таких символов не должно быть
                        else {
                            match = true;
                        }//если нашли
                    }
                    ++pt;
                }
            }
            if (b == match) {
                res = false;
            }
            else {
                res = true;
                ++s; p = ++pt;//закрывающая скобка
            }
        }
 
        if (res) {
            res = false;
        }
        else if (*p == L'#' && *s <= L'9' && *s >= L'0') {
            ++s, ++p;
        }
        else if (*p == L'*') {
            rs = s, rp = ++p;
        }
        else if (!*s) {
            return !*p;
        }
        else if (*p == L'?' || *s == *p && *p != L'[' && *p != L'#') {
            ++s, ++p;
        }
        else if (rs) {
            s = ++rs, p = rp;
        }
        else {
            return false;
        }
    }
}
Тестовый набор:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
std::vector < std::vector<const wchar_t* >> testArr =
        {
            {L"XYXZZXYXYXZZXY", L"*X*X?*X*X?",L"True"},         //' Speed test
            {L"aBBBa", L"a*a",L"True"},
            {L"F" , L"[A-Z]" ,L"True"},
            {L"F" , L"[!A-Z]",NULL},
            {L"a2a" , L"a#a", L"True"},
            {L"aM5b" , L"a[L-P]#[!c-e]", L"True"},
            {L"BAT123khg" , L"B?T*", L"True"},
            {L"CAT123khg" , L"B?T*",NULL},
            {L"ab" , L"a*b",L"True"},
            {L"a*b" , L"a[*]b", NULL},
            {L"axxxxxb" , L"a[*]b",NULL},
            {L"a [xyz" , L"a [[]*", L"True"},
            {L"aM5b" , L"a*?b", L"True"},
            {L"aM5b" , L"a*[1-4-9][!c-e]", L"True"},
            {L"aM55b" , L"a*[1-4-9][!c-e]", L"True"},
            {L"aM55b" , L"a*[1-45-9][!c-e]", L"True"},
            {L"aM5b" , L"*#[!c-e]", L"True"},
            {L"5*", L"5[*]", L"True"},
            {L"?n", L"[?]n", L"True"},
            {L"a", L"[a-cdf]", L"True"},
            {L"b", L"[a-cdf]", L"True"},
            {L"c", L"[a-cdf]", L"True"},
            {L"d", L"[a-cdf]", L"True"},
            {L"f", L"[a-cdf]", L"True"},
            {L"-", L"[-acdf]", L"True"},
            {L"a", L"[-acdf]", L"True"},
            {L"c", L"[-acdf]", L"True"},
            {L"d", L"[-acdf]", L"True"},
            {L"f", L"[-acdf]", L"True"},
            {L"[", L"[ [ ]", L"True"},
            {L"]", L"]", L"True"},
            {L"abc_d", L"abc[_]d*", L"True"},
            {L"abc_de", L"abc[_]d*", L"True"},
            {L"abcd", L"abc[def]", L"True"},
            {L"abce", L"abc[def]", L"True"},
            {L"abcf", L"abc[def]", L"True"},
            {L"abcdef", L"abc*[de]ef", L"True"},
            {L"abcyef", L"abc[xz]ef", NULL},
            {L"abcxef", L"abc[xz]ef", L"True"},
            {L"abcyef", L"abc[!xz]ef", L"True"},
            {L"abcxef", L"abc[!xz]ef", NULL},
            {L"ac5c5b", L"a*[1-56-9][!c-e]", L"True"},
            {L"", L"", L"True"},
            {L"", L"*", L"True"},
            {L"", L"[]", L"True"},
            {L"", L"[!]", NULL},
            {L"", L"[]*", L"True"},
            {L"", L"[!]*", NULL},
            {L"1", L"[!]*", NULL},
            {L"1", L"[]*", L"True"},
            {L"1", L"[!]*", NULL},
            {L"1", L"[!]", NULL},
            {L"1", L"*[!]", NULL},
            {L"1", L"*[]", L"True"},
            {L"1", L"#[]", L"True"},
            {L"1", L"#[!]", NULL},
            {L"12", L"#[!]", NULL},
            {L"12", L"#[!]*", NULL},
            {L"123", L"*[!]*", NULL},
            {L"1!3", L"*[!]*", L"True"},
            {L"!", L"*[!]*", L"True"},
            {L"!", L"[!]", L"True"},
            {L"!a", L"*[!a]*", L"True"},
            {L"!a", L"[!a]*", L"True"},
            {L"!a", L"*[!a]", NULL},
            {L"!a", L"[!a]", NULL},
            {L"a", L"[!a]", NULL},
            {L"b", L"[!a]", L"True"},
            {L"2", L"#[]", L"True"},
            {L"*", L"[*]", L"True"},
            {L"1", L"[*]", NULL},
            {L"!", L"[!-!]", NULL},
            {L"1", L"[!-!]", L"True"},
            {L"!", L"[-!]", L"True"},
            {L"!", L"[!-]", L"True"},
            {L"-", L"[!-]", NULL},
            {L"-", L"[-]", L"True"},
            {L"***", L"*[*]*", L"True"},
            {L"???", L"?[?]?", L"True"},
            {L"###", L"#[#]#", NULL},
            {L"[[[[[", L"[[]?*[[]", L"True"},
            //{L"a [xyz" , L"a [*", NULL}             //' Throws Error 93 (invalid pattern string).
        };
Добавлено через 5 минут
Нужен спец по Си, как ускорить LikeVB()?
Алексей1153, слежу за вашим вариантом, интересный подход, чисто на С++. Я то ушёл в Си. Хотелось бы видеть и ваше решение.
0
фрилансер
 Аватар для Алексей1153
6495 / 5723 / 1133
Регистрация: 11.10.2019
Сообщений: 15,284
08.06.2023, 09:47
bedvit, свой вариант я пока не доделывал. На твоём попробовал по 10 раз запускать тесты с флагом -O3 (при переходе по ссылке флаг сам не выставится, заходи в шестерёнку -> extra compiler flags -> -O3 -> done)
https://onlinegdb.com/fai4bbbz4
Test pattern...

LikeVB...

Speed test...
check, ms: 761 1
check, ms: 698 1
check, ms: 614 1
check, ms: 549 1
check, ms: 516 1
check, ms: 528 1
check, ms: 527 1
check, ms: 522 1
check, ms: 517 1
check, ms: 519 1

LikeVB, ms: 702 1
LikeVB, ms: 711 1
LikeVB, ms: 700 1
LikeVB, ms: 701 1
LikeVB, ms: 705 1
LikeVB, ms: 701 1
LikeVB, ms: 701 1
LikeVB, ms: 700 1
LikeVB, ms: 702 1
LikeVB, ms: 717 1
sh: 1: pause: not found


Добавлено через 54 минуты
bedvit, а каким образом предполагается экранировать закрывающую квадратную скобку ?

Цитата Сообщение от bedvit Посмотреть сообщение
"[[]?*[[]"
- ведь это можно рассматривать как

[[]?*[[]
или как
[[]?*[[]
0
 Аватар для bedvit
1210 / 261 / 22
Регистрация: 20.05.2016
Сообщений: 1,147
Записей в блоге: 22
08.06.2023, 12:14  [ТС]
Алексей1153, выше по ссылке: "
Note
To match the special characters left bracket ([), question mark (?), number sign (#), and asterisk (*), enclose them in brackets. The right bracket (]) can't be used within a group to match itself, but it can be used outside a group as an individual character."
0
фрилансер
 Аватар для Алексей1153
6495 / 5723 / 1133
Регистрация: 11.10.2019
Сообщений: 15,284
08.06.2023, 13:14
Цитата Сообщение от bedvit Посмотреть сообщение
{L"a*b" , L"a[*]b", NULL},
во-первых, не NULL, а nullptr. Или {}
во-вторых - почему не должно матчится, я не могу понять?
a->a
[*]->*
b->b

всё совпадает
0
 Аватар для bedvit
1210 / 261 / 22
Регистрация: 20.05.2016
Сообщений: 1,147
Записей в блоге: 22
08.06.2023, 13:55  [ТС]
Алексей1153, в таком варианте будет true, все верно. Но первоначально там был пробел, берите данные из теста по ссылке. Видимо форум режет при вставке.
0
фрилансер
 Аватар для Алексей1153
6495 / 5723 / 1133
Регистрация: 11.10.2019
Сообщений: 15,284
08.06.2023, 14:15
bedvit, а как должна работать маска [!] ? Тоже пустая строка?
0
 Аватар для bedvit
1210 / 261 / 22
Регистрация: 20.05.2016
Сообщений: 1,147
Записей в блоге: 22
08.06.2023, 14:34  [ТС]
"во-первых, не NULL, а nullptr. Или {}" здесь это не важно. nullptr нет в Си. NULL валидное значение для указателя в Си.

Добавлено через 2 минуты
маска [!] это поиск одного символа '!' (восклицательный знак). В тесте есть {L"!", L"[!]", L"True"},

Добавлено через 9 минут
А другой диалект VB говорит False
https://onlinegdb.com/yYBmoRqmN
Я использовал для проверки транслятор VBA, там True

Добавлено через 47 секунд
Надо посмотреть, что SQL скажет

Добавлено через 6 минут
MS SQL говорит True
SELECT iif('^' Like '[^]','True','False')=True
https://dev.sqliteonline.com/
0
фрилансер
 Аватар для Алексей1153
6495 / 5723 / 1133
Регистрация: 11.10.2019
Сообщений: 15,284
08.06.2023, 15:06
bedvit, теперь вот так https://onlinegdb.com/qEZqOehf3
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
ok   :   string  "XYXZZXYXYXZZXY"  LIKE  "*X*X?*X*X?"        must be true
ok   :   string  "aBBBa"           LIKE  "a*a"               must be true
ok   :   string  "F"               LIKE  "[A-Z]"             must be true
ok   :   string  "F"               LIKE  "[!A-Z]"            must be false
ok   :   string  "a2a"             LIKE  "a#a"               must be true
ok   :   string  "aM5b"            LIKE  "a[L-P]#[!c-e]"     must be true
ok   :   string  "BAT123khg"       LIKE  "B?T*"              must be true
ok   :   string  "CAT123khg"       LIKE  "B?T*"              must be false
ok   :   string  "ab"              LIKE  "a*b"               must be true
ok   :   string  "a*b"             LIKE  "a[*]b"            must be false
ok   :   string  "axxxxxb"         LIKE  "a[*]b"            must be false
ok   :   string  "a [xyz"          LIKE  "a [[]*"            must be true
ok   :   string  "aM5b"            LIKE  "a*?b"              must be true
ok   :   string  "aM5b"            LIKE  "a*[1-4-9][!c-e]"   must be true
ok   :   string  "aM55b"           LIKE  "a*[1-4-9][!c-e]"   must be true
ok   :   string  "aM55b"           LIKE  "a*[1-45-9][!c-e]"  must be true
ok   :   string  "aM5b"            LIKE  "*#[!c-e]"          must be true
ok   :   string  "5*"              LIKE  "5[*]"              must be true
ok   :   string  "?n"              LIKE  "[?]n"              must be true
ok   :   string  "a"               LIKE  "[a-cdf]"           must be true
ok   :   string  "b"               LIKE  "[a-cdf]"           must be true
ok   :   string  "c"               LIKE  "[a-cdf]"           must be true
ok   :   string  "d"               LIKE  "[a-cdf]"           must be true
ok   :   string  "f"               LIKE  "[a-cdf]"           must be true
ok   :   string  "-"               LIKE  "[-acdf]"           must be true
ok   :   string  "a"               LIKE  "[-acdf]"           must be true
ok   :   string  "c"               LIKE  "[-acdf]"           must be true
ok   :   string  "d"               LIKE  "[-acdf]"           must be true
ok   :   string  "f"               LIKE  "[-acdf]"           must be true
ok   :   string  "["               LIKE  "[ [ ]"             must be true
ok   :   string  "]"               LIKE  "]"                 must be true
ok   :   string  "abc_d"           LIKE  "abc[_]d*"          must be true
ok   :   string  "abc_de"          LIKE  "abc[_]d*"          must be true
ok   :   string  "abcd"            LIKE  "abc[def]"          must be true
ok   :   string  "abce"            LIKE  "abc[def]"          must be true
ok   :   string  "abcf"            LIKE  "abc[def]"          must be true
ok   :   string  "abcdef"          LIKE  "abc*[de]ef"        must be true
ok   :   string  "abcyef"          LIKE  "abc[xz]ef"         must be false
ok   :   string  "abcxef"          LIKE  "abc[xz]ef"         must be true
ok   :   string  "abcyef"          LIKE  "abc[!xz]ef"        must be true
ok   :   string  "abcxef"          LIKE  "abc[!xz]ef"        must be false
ok   :   string  "ac5c5b"          LIKE  "a*[1-56-9][!c-e]"  must be true
ok   :   string  ""                LIKE  ""                  must be true
ok   :   string  ""                LIKE  "*"                 must be true
ok   :   string  ""                LIKE  "[]"                must be true
ok   :   string  ""                LIKE  "[!]"               must be false
ok   :   string  ""                LIKE  "[]*"               must be true
ok   :   string  ""                LIKE  "[!]*"              must be false
ok   :   string  "1"               LIKE  "[!]*"              must be false
ok   :   string  "1"               LIKE  "[]*"               must be true
ok   :   string  "1"               LIKE  "[!]*"              must be false
ok   :   string  "1"               LIKE  "[!]"               must be false
ok   :   string  "1"               LIKE  "*[!]"              must be false
ok   :   string  "1"               LIKE  "*[]"               must be true
ok   :   string  "1"               LIKE  "#[]"               must be true
ok   :   string  "1"               LIKE  "#[!]"              must be false
ok   :   string  "12"              LIKE  "#[!]"              must be false
ok   :   string  "12"              LIKE  "#[!]*"             must be false
ok   :   string  "123"             LIKE  "*[!]*"             must be false
ok   :   string  "1!3"             LIKE  "*[!]*"             must be true
ok   :   string  "!"               LIKE  "*[!]*"             must be true
ok   :   string  "!"               LIKE  "[!]"               must be true
ok   :   string  "!a"              LIKE  "*[!a]*"            must be true
ok   :   string  "!a"              LIKE  "[!a]*"             must be true
ok   :   string  "!a"              LIKE  "*[!a]"             must be false
ok   :   string  "!a"              LIKE  "[!a]"              must be false
ok   :   string  "a"               LIKE  "[!a]"              must be false
ok   :   string  "b"               LIKE  "[!a]"              must be true
ok   :   string  "2"               LIKE  "#[]"               must be true
ok   :   string  "*"               LIKE  "[*]"               must be true
ok   :   string  "1"               LIKE  "[*]"               must be false
ok   :   string  "!"               LIKE  "[!-!]"             must be false
ok   :   string  "1"               LIKE  "[!-!]"             must be true
ok   :   string  "!"               LIKE  "[-!]"              must be true
ok   :   string  "!"               LIKE  "[!-]"              must be true
ok   :   string  "-"               LIKE  "[!-]"              must be false
ok   :   string  "-"               LIKE  "[-]"               must be true
ok   :   string  "***"             LIKE  "*[*]*"             must be true
ok   :   string  "???"             LIKE  "?[?]?"             must be true
ok   :   string  "###"             LIKE  "#[#]#"             must be false
ok   :   string  "[[[[["           LIKE  "[[]?*[[]"          must be true
ok   :   string  "a [xyz"          LIKE  "a [*"              must be false
 
errors_count=0
Добавлено через 4 минуты
Цитата Сообщение от Алексей1153 Посмотреть сообщение
ok : string "a*b" LIKE "a[*]b" must be false
ok : string "axxxxxb" LIKE "a[*]b" must be false
да, почему-то парсер сайта вырезает тут пробелы перед скобками )
0
 Аватар для bedvit
1210 / 261 / 22
Регистрация: 20.05.2016
Сообщений: 1,147
Записей в блоге: 22
08.06.2023, 15:14  [ТС]
Алексей1153, отлично! Скорость не меряли?
0
фрилансер
 Аватар для Алексей1153
6495 / 5723 / 1133
Регистрация: 11.10.2019
Сообщений: 15,284
08.06.2023, 15:16
bedvit, нет
0
 Аватар для bedvit
1210 / 261 / 22
Регистрация: 20.05.2016
Сообщений: 1,147
Записей в блоге: 22
08.06.2023, 20:42  [ТС]
Замеры скорости (пока Си обгоняет С++).
Оба варианта выполняют тестовые шаблоны без ошибок.

Speed test...
check, ms: 1180
LikeVB, ms: 1345
WildCardParser::Match, ms: 15941

https://onlinegdb.com/UY9nlDVqJ

Добавлено через 6 минут
С флагом
-O3
check, ms: 485
LikeVB, ms: 913
WildCardParser::Match, ms: 3588

Добавлено через 9 минут
https://onlinegdb.com/OFHw6N97i

Добавлено через 1 минуту
Из замеченного, флаг -O3 серьёзно ускоряет С++, в отличии от Си

Добавлено через 3 минуты
третий замер, видимо что-то кешируется:
check, ms: 422
LikeVB, ms: 648
WildCardParser::Match, ms: 2516
0
фрилансер
 Аватар для Алексей1153
6495 / 5723 / 1133
Регистрация: 11.10.2019
Сообщений: 15,284
08.06.2023, 22:19
bedvit, конечно же, нужно смотреть с оптимизацией. Попробую покрутить свой код,
а тут я немного почистил тест (ещё без изменений кода) https://onlinegdb.com/CM__vaI7C
LikeVB...
ok=16200000 error=0 ms=217
ok=16200000 error=0 ms=191
ok=16200000 error=0 ms=189
ok=16200000 error=0 ms=234
ok=16200000 error=0 ms=240

WildCardParser::Match...
ok=16200000 error=0 ms=895
ok=16200000 error=0 ms=724
ok=16200000 error=0 ms=753
ok=16200000 error=0 ms=724
ok=16200000 error=0 ms=783
Добавлено через 1 час 8 минут
bedvit, удалось немного сократить разницу https://onlinegdb.com/y5pnhUTkN-O3 , конечно)

пока что не знаю, что где ещё подпнуть
LikeVB...
ok=16200000 error=0 ms=168
ok=16200000 error=0 ms=166
ok=16200000 error=0 ms=165
ok=16200000 error=0 ms=165
ok=16200000 error=0 ms=168

WildCardParser::Match...
ok=16200000 error=0 ms=487
ok=16200000 error=0 ms=437
ok=16200000 error=0 ms=441
ok=16200000 error=0 ms=438
ok=16200000 error=0 ms=439
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.06.2023, 22:19

SQL или Visual Basic? Или Макросы?
Здравствуйте. Делая проект по заданию базы для избирательного, столкнулась с такой проблемой - в мою готовую базу данных Access...

Как получить индекс элемента (или его позицию или количество элементов до него) в set или multiset от lower_bound?
не работающий код((( #include&lt;bits/stdc++.h&gt; #define ff first #define ss second #define ll long long // #define int long...

Есть ли такая функция даты SQL которая позволяет вытащить записи по опред году, или месяцу или дню
не используя оператор like

Как лучше и быстрее из SQL в QVector и в GUI или сразу из SQL в GUI
Доброе время суток! Ну собственно вопрос в теме, как лучше сделать. Сначала прочитать SQLite в вектор и работать с ним и оставить файл...

Что лучше, учить команды CMD или BASH или PowerShell или все они важны или лучше язык программирования?
В заголовке имел в виду, что если изучаю распространенный язык программирования, например Python, то команды из этих сред командных...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса Калибровка параметров симбиотической модели: технический обзор Содержание: Введение Постановка проблемы Технические аспекты реализации Процесс внедрения изменений
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru