Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Проверить формат varchar. my SQL

1287  1 2 3 4 все
melodi_ постоялец21.06.21 18:33
NEW 21.06.21 18:33 
в ответ NightWatch 21.06.21 18:07, Последний раз изменено 21.06.21 18:33 (melodi_)

Что то не так:(((

Я тестирую вариант: xxan(n)(n)(n)a:

select SUBSTRING('11A45BCd', 1, 2) regexp '[a-zA-Z0-9]{2}' and SUBSTRING('11A45BCd', 3, 1) regexp '[a-zA-Z]' and SUBSTRING('11A45BCd', 4, 1) regexp '[0-9]'

and SUBSTRING('11A45BCd', -1) regexp '[a-zA-Z]' and SUBSTRING('11A45BCd', 5) regexp '[0-9]{0,3}';


SUBSTRING('11A45BCd', 1, 2) regexp '[a-zA-Z0-9]{2}'--> тестирую xx

SUBSTRING('11A45BCd', 3, 1) regexp '[a-zA-Z]'--> тестирую a на 3 месте

SUBSTRING('11A45BCd', 4, 1) regexp '[0-9]'--> тестирую n обязательную

SUBSTRING('11A45BCd', 5) regexp '[0-9]{0,3}'-->тест (n), когда n или 0 или 1 или 2 или 3.


Для '11A45BCd' -->1, что не есть правда.

#41 
NightWatch коренной житель21.06.21 18:37
NightWatch
NEW 21.06.21 18:37 
в ответ melodi_ 21.06.21 18:33

Даже вникать не буду.

Пост #29

#42 
Murr патриот21.06.21 18:49
Murr
NEW 21.06.21 18:49 
в ответ NightWatch 21.06.21 17:52

Значит, тема была.

-----

Так в "теме" основное не то что она была, а как ее донесли...

и докопался ли студент после того как "тема была" до понимания вопроса.

Пока что наблюдается что студент просто прошел мимо вопроса...

и даже не имеет чем его подумать... хммм

Способ решения задачи - перебирать наборы значков до получения решения

- не работает в виду большого количества означенных значков...

#43 
melodi_ постоялец21.06.21 18:51
NEW 21.06.21 18:51 
в ответ NightWatch 21.06.21 18:37

Скажи только, что человек должен понимать под ^ matches the beginning of a string и под $ matches the end of the string?

#44 
Murr патриот21.06.21 18:54
Murr
NEW 21.06.21 18:54 
в ответ melodi_ 21.06.21 18:16

Пока я должна ДБ без теории алгоритмов осилить.

-----

В твоем вопросе от ДБ - только СЕЛЕКТ. Ну а СЕЛЕКТ в ДБ - 1-2% от того что надо и знать, и понимать...


По РЕГЭКСПу... посмотри сайт где можно его отлаживать - все быстрее пойдет перебор вариантов...


если я не ошибаюсь

-----

Ошибаешься.

#45 
Murr патриот21.06.21 19:01
Murr
NEW 21.06.21 19:01 
в ответ melodi_ 21.06.21 18:33

Что то не так

-----

Разумеется.

Начни с того, что если уж используется regexp...

ты, кстати, в курсе что не все версии отрабатывают одинаково?..

да и системные настройки разные есть...

то обо всяких substring() надо забыть сразу и навсегда?

#46 
MrSanders коренной житель21.06.21 19:08
NEW 21.06.21 19:08 
в ответ melodi_ 21.06.21 17:53

Как упрощённо представить себе работу жадного (greedy) регулярного выражения. (на самом деле работают они по-другому, так было бы слишком медленно)

Берём регексп [a-zA-Z0-9]{2}[a-zA-Z]?[0-9]{1,4}[a-zA-Z]? Оно состоит из правил, которым должна соответствовать последовательность символов. Парсер разбирает регексп на правила.

1. 2 буквы или цифры

2. 1 буква или ничего

3. от 1 до 4 цифр

4. 1 буква или ничего


Получаем на вход строчку

ABCD123456

И начинаем проверять. С 1й буквы. ^ буду обозначать на каком месте у нас "курсор" регекспа. Всё что до курсора уже подошло к правилам, всё что после, правилами не проверялось.

^ABCD123456

1. 2 буквы или цифры. AB подходит? Да. Идём дальше.

AB^CD123456

2. 1 буква или ничего. C подходит? Да.

ABC^D123456

3. 1-4 цифры. А у нас D. Не подходит. Откатываемся назад к первому правилу с "вариантами" (где количество символов может меняться)

AB^CD123456

2. 1 буква или ничего. Берём ничего.

AB^CD123456

3. 1-4 цифры. А у нас C. Не подходит. Откатываемся назад до самого начала, больше "ветвящихся" правил у нас не было. Значит наша строка не подошла. Всё, ошибка? Не-а. Отбрасываем первый символ. И начинаем заново.


^BCD123456

1. 2 буквы или цифры. BC подходит? Да. Идём дальше.

BC^D123456

2. 1 буква или ничего. D подходит? Да.

BCD^123456

3. 1-4 цифры. Есть 1234, забираем всё, мы "жадные".

BCD1234^56

4. 1 буква или ничего. 5 как буква не подходит, но как "ничего" вполне.

BCD1234^56


Правила закончились. Значит всё от начала до курсора устроило наше регулярное выражение. Мы "заматчили" BCD1234.


Так понятнее? А теперь, прежде чем говорить что регулярное выражение "не работает", найдите пример, с которым оно работает не так, как вы ожидали.

#47 
melodi_ постоялец21.06.21 19:09
NEW 21.06.21 19:09 
в ответ Murr 21.06.21 19:01

SUBSTRING(fln, -2, 3) regexp '[0-9]'

Теперь работает. Немного сдесь поменяла.


ELSEIF char_length(fln) > 3 and # hier wird der Fall xxan(n)(n)(n)a getestet.

SUBSTRING(fln, 1, 2) regexp '[a-zA-Z0-9]{2}' and SUBSTRING(fln, 3, 1) regexp '[a-zA-Z]' and SUBSTRING(fln, 4, 1) regexp '[0-9]'

and SUBSTRING(fln, -1) regexp '[a-zA-Z]' and SUBSTRING(fln, -2, 3) regexp '[0-9]' then set result_c = 1;

#48 
MrSanders коренной житель21.06.21 19:12
NEW 21.06.21 19:12 
в ответ melodi_ 21.06.21 18:33
regexp '[0-9]{0,3}'

Вернёт 1 для ЛЮБОЙ строки.

В "АБВГД" содержится от 0 до 3 символов? - Да.

В пустой строке содержится он 0 до 3 символов? - Да.

#49 
Murr патриот21.06.21 19:18
Murr
NEW 21.06.21 19:18 
в ответ melodi_ 21.06.21 19:09

Теперь работает.

-----

https://www.w3schools.com/sql/func_mysql_substring.asp

Минус две буквы, говоришь? Хи-хи...


И ведь это потом надо будет кому-то учить программировать... безум

#50 
Программист коренной житель21.06.21 19:32
NEW 21.06.21 19:32 
в ответ melodi_ 18.06.21 15:55

Но не могу придумать как проверить следующие условия (вместо ?????????):



Наверное я чего-то не понимаю, но regex номера рейсы выглядит так:

\w{2}[a-zA-Z]?\d{1,4}[a-zA-Z]?
#51 
Murr патриот21.06.21 19:57
Murr
NEW 21.06.21 19:57 
в ответ Программист 21.06.21 19:32

Наверное я чего-то не понимаю

-----

Ты полагаешь что никто до тебя не мог написать нужное по заданию?

Все пытались заставить ТС хоть немного начать думать и дойти до понимания что и как надо делать... безум

#52 
Программист коренной житель21.06.21 20:24
NEW 21.06.21 20:24 
в ответ Murr 21.06.21 19:57, Последний раз изменено 21.06.21 20:24 (Программист)

Попытку что-то объяснить я увидел только в посте #47 , до этого был какой-то ужОс :) Ну ответ я написал пока листал 1-ю страницу.

#53 
melodi_ постоялец21.06.21 20:40
NEW 21.06.21 20:40 
в ответ Murr 21.06.21 19:57
Ты полагаешь что никто до тебя не мог написать нужное по заданию?
Все пытались заставить ТС хоть немного начать думать и дойти до понимания что и как надо делать... безум

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

^

^ matches the beginning of a string (inside square brackets it can also mean NOT - see below):

SELECT 'Maria' REGEXP '^Ma';
+----------------------+
| 'Maria' REGEXP '^Ma' |
+----------------------+
|                    1 |
+----------------------+

$

$ matches the end of a string:

SELECT 'Maria' REGEXP 'ia$';
+----------------------+
| 'Maria' REGEXP 'ia$' |
+----------------------+
|                    1 | 

+----------------------+.

я придумала, что длинна стринга делится попалам и с '^' проверяеться первая часть, а с '$' вторая(хвост). Еще задавалась вопросом, а что с серединой. Ужос.

#54 
melodi_ постоялец21.06.21 20:45
NEW 21.06.21 20:45 
в ответ MrSanders 21.06.21 19:08

Как упрощённо представить себе работу жадного (greedy) регулярного выражения. (на самом деле работают они по-другому, так было бы слишком медленно)

Берём регексп [a-zA-Z0-9]{2}[a-zA-Z]?[0-9]{1,4}[a-zA-Z]? Оно состоит из правил, которым должна соответствовать последовательность символов. Парсер разбирает регексп на правила.

1. 2 буквы или цифры

2. 1 буква или ничего

3. от 1 до 4 цифр

4. 1 буква или ничего

Получаем на вход строчку

ABCD123456

И начинаем проверять. С 1й буквы. ^ буду обозначать на каком месте у нас "курсор" регекспа. Всё что до курсора уже подошло к правилам, всё что после, правилами не проверялось.

^ABCD123456

1. 2 буквы или цифры. AB подходит? Да. Идём дальше.

AB^CD123456

2. 1 буква или ничего. C подходит? Да.

ABC^D123456

3. 1-4 цифры. А у нас D. Не подходит. Откатываемся назад к первому правилу с "вариантами" (где количество символов может меняться)

AB^CD123456

2. 1 буква или ничего. Берём ничего.

AB^CD123456

3. 1-4 цифры. А у нас C. Не подходит. Откатываемся назад до самого начала, больше "ветвящихся" правил у нас не было. Значит наша строка не подошла. Всё, ошибка? Не-а. Отбрасываем первый символ. И начинаем заново.

^BCD123456

1. 2 буквы или цифры. BC подходит? Да. Идём дальше.

BC^D123456

2. 1 буква или ничего. D подходит? Да.

BCD^123456

3. 1-4 цифры. Есть 1234, забираем всё, мы "жадные".

BCD1234^56

4. 1 буква или ничего. 5 как буква не подходит, но как "ничего" вполне.

BCD1234^56

Правила закончились. Значит всё от начала до курсора устроило наше регулярное выражение. Мы "заматчили" BCD1234.

Так понятнее? А теперь, прежде чем говорить что регулярное выражение "не работает", найдите пример, с которым оно работает не так, как вы ожидали.


Спасибо большое. Вам бы вместо нашего Профа надо! Теперь понятно, что можно с этим делать. Очень эффективно работает.

#55 
Murr патриот21.06.21 21:08
Murr
NEW 21.06.21 21:08 
в ответ Программист 21.06.21 20:24

Попытку что-то объяснить

-----

Не всегда требуется объяснять.

Точнее - не очень полезно, с точки зрения развития, давать детальные разъяснения.

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


В данном случае - чел не понимает практически ничего и подставив решение в задачу останется таким же непонимающим.

Потом ему надо будет как-то делать работу. Непонимая ни с чем работает, ни что делает, ни как может/должно быть...


Ну ответ я написал пока листал 1-ю страницу.

-----

Возьми в голову - не надо писать ответ. Надо писать что надо изучить для... спок

#56 
Murr патриот21.06.21 21:13
Murr
NEW 21.06.21 21:13 
в ответ melodi_ 21.06.21 20:40

я придумала ... Ужос.

-----

Ужас не в этом.

Ужас в том, что нет понимания "куда копать", чтобы найти решение... безум

#57 
melodi_ постоялец21.06.21 21:44
NEW 21.06.21 21:44 
в ответ MrSanders 21.06.21 19:08

Что есть, то есть. Но ситуация еще хуже...Теперь правда мне стыдно. Когда все так объяснил...я все равно не правильно что то сделала. Вернее я получаю не то, что ожидаю:

Мое слово: xx(a)n(n)(n)(n)(a)

1. 2 буквы или цифры --> [[a-zA-Z0-9]{2}]

2. 1 буква или ничего-->[a-zA-Z]?

3. 1 цифра --> [0-9]{1}

4.1 цифра или ничего-->[0-9]?

5.1 цифра или ничего-->[0-9]?

6.1 цифра или ничего-->[0-9]?

4. 1 буква или ничего--> [a-zA-Z]?


Вместе: '^[a-zA-Z0-9]{2}[a-zA-Z]?[0-9]{1}[0-9]?[0-9]?[0-9]?[a-zA-Z]?'

Получаем на вход строчку:

'55A5AAAB'

И начинаем проверять. С 1й буквы.

^55A5AAAB

До этого места 55A5^AAABправильно тестирует. С этого нет.(((

[0-9]{1,4} тоже не будет работать. Но тут хоть понятно. Ему достаточно чтоб один из этих знаков был правильный, а остальные ему по хер, если не подходят.

Но когда я ему конкретно с

3. 1 цифра --> [0-9]{1}

4.1 цифра или ничего-->[0-9]?

5.1 цифра или ничего-->[0-9]?

6.1 цифра или ничего-->[0-9]? Почему тоже игнорирует?


Когда в коце еще $ добавила, тогда все правильно! Но почему?

drop function if exists validate_flight_number;

DELIMITER $$

CREATE FUNCTION validate_flight_number (fln varchar(8)) RETURNS int(1)

BEGIN DECLARE result_c int;

IF char_length(fln) >= 3 and fln regexp '^[a-zA-Z0-9]{2}[a-zA-Z]?[0-9]{1}[0-9]?[0-9]?[0-9]?[a-zA-Z]?$' then set result_c = 1;

else set result_c = 0;

END IF;

RETURN result_c;

END$$

DELIMITER ;


#58 
NightWatch коренной житель21.06.21 23:17
NightWatch
NEW 21.06.21 23:17 
в ответ melodi_ 21.06.21 21:44, Последний раз изменено 21.06.21 23:29 (NightWatch)
Получаем на вход строчку: '55A5AAAB'
И начинаем проверять. С 1й буквы.
^55A5AAAB
До этого места 55A5^AAABправильно тестирует. С этого нет.(((

Продолжение для остатка шаблона [0-9]?[0-9]?[0-9]?[a-zA-Z]?

55A5^AAAB

1 цифра или ничего. А как буква не подходит, но как "ничего" вполне.

55A5^AAAB

1 цифра или ничего. А как буква не подходит, но как "ничего" вполне.

55A5^AAAB

1 цифра или ничего. А как буква не подходит, но как "ничего" вполне.

55A5^AAAB

1 буква или ничего. А как буква подходит.

55A5A^AAB

Правила закончились. Значит всё от начала до курсора устроило наше регулярное выражение. Мы "заматчили" 55A5A.


А вот если бы в конце стояло $, то мы бы имели еще одно правило:

55A5A^AAB

Конец строки. А - это не конец строки. Облом.


"Откаты" я не описáл, но и так должно быть понятно, что совпадений не будет.

#59 
NightWatch коренной житель21.06.21 23:20
NightWatch
NEW 21.06.21 23:20 
в ответ melodi_ 21.06.21 21:44
BEGIN DECLARE result_c int;
IF char_length(fln) >= 3 and
then set result_c = 1;
else set result_c = 0;
END IF;
RETURN result_c;
END$$

Все это лишнее. Функция пишется в одну строчку.

#60 
1 2 3 4 все