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

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

1287  1 2 3 4 все
melodi_ постоялец18.06.21 15:55
18.06.21 15:55 
Последний раз изменено 18.06.21 15:57 (melodi_)

Привет помогите пож. закончить функцию. (С. ниже)

Чем проверить Номер Рейса (Варчар)? Он может быть мин. 3 и мах. 8 знаков. Я уже это проверерила в Функции.


drop function if exists validate_flight_number;

DELIMITER $$

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

BEGIN DECLARE result_c int;

IF char_length(fln) >= 3

and char_length(fln) <= 8

and ??????????

THEN SET result_c = 1;

ELSE set result_c = 0 ;

END IF;

RETURN result_c;

END$$

DELIMITER ;


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


#1 
NightWatch коренной житель18.06.21 16:53
NightWatch
miltorg коренной житель18.06.21 16:59
miltorg
NEW 18.06.21 16:59 
в ответ melodi_ 18.06.21 15:55

а напишите по русски - я люблю регулярки

Половина евро в час
#3 
melodi_ постоялец21.06.21 11:24
NEW 21.06.21 11:24 
в ответ miltorg 18.06.21 16:59

Эта сволочь не работает как надо((((((((

{}

x{n} and x{m,n} This notation is used to match many instances of the x. In the case of x{n} the match must be exactly that many times. In the case of x{m,n}, the match can occur from m to n times. For example, to match zero or one instance of the string ari (which is identical to (ari)?), the following can be used:

SELECT 'Maria' REGEXP '(ari){0,1}';
+-----------------------------+
| 'Maria' REGEXP '(ari){0,1}' |
+-----------------------------+
|                           1 |
+-----------------------------+
#4 
MrSanders коренной житель21.06.21 11:38
NEW 21.06.21 11:38 
в ответ melodi_ 21.06.21 11:24

Почему вы так думаете? Вы выполнили SELECT 'Maria' REGEXP '(ari){0,1}'

Какой результат вы ожидали увидеть?

#5 
NightWatch коренной житель21.06.21 11:58
NightWatch
NEW 21.06.21 11:58 
в ответ MrSanders 21.06.21 11:38

Вероятно, 0, так как "Maria" - явно не номер рейса. улыб

#6 
MrSanders коренной житель21.06.21 14:00
NEW 21.06.21 14:00 
в ответ NightWatch 21.06.21 11:58

Нинадатарапицца! До номера рейса нам ещё идти и идти. Пока что мы ищем ari в Maria.

#7 
melodi_ постоялец21.06.21 14:23
NEW 21.06.21 14:23 
в ответ MrSanders 21.06.21 14:00

Почему вы так думаете? Вы выполнили SELECT 'Maria' REGEXP '(ari){0,1}'

Какой результат вы ожидали увидеть?

'Maria' это просто пример из сети. Но если применить только этот синтакс на номер рейса, то не работает:


fln regexp '[a-zA-Z0-9]{1}[a-zA-Z0-9]{1}[a-zA-Z]{0,1}[0-9]{1}[0-9]{0,1}[0-9]{0,1}[0-9]{0,1}[a-zA-Z]{0,1}'


ИЗ задания: xx(a)n(n)(n)(n)(a)

x : (a-zA-Z0-9) --> [a-zA-Z0-9]{1}

x: (a-zA-Z0-9) --> [a-zA-Z0-9]{1}

(a): (a-zA-Z)--> [a-zA-Z]{0,1}

n: (0-9)-->[0-9]{1}

(n):(0-9)-->[0-9]{0,1}

(n):(0-9)-->[0-9]{0,1}

(n):(0-9)-->[0-9]{0,1}

(a): (a-zA-Z)--> [a-zA-Z]{0,1}


Мне нужно что то найти, что б с интексом работало (как индекс в стринге/списке).

#8 
melodi_ постоялец21.06.21 14:26
NEW 21.06.21 14:26 
в ответ melodi_ 21.06.21 14:23

select '55?8777K' regexp '[a-zA-Z0-9]{1}[a-zA-Z0-9]{1}[a-zA-Z]{0,1}[0-9]{1}[0-9]{0,1}[0-9]{0,1}[0-9]{0,1}[a-zA-Z]{0,1}';

-->1((((((((((

#9 
melodi_ постоялец21.06.21 14:29
NEW 21.06.21 14:29 
в ответ MrSanders 21.06.21 11:38

Может все возможные комбинации в if then опросить?

#10 
NightWatch коренной житель21.06.21 14:30
NightWatch
NEW 21.06.21 14:30 
в ответ melodi_ 21.06.21 14:26

^

Match the beginning of a string

$

Match the end of a string.

https://dev.mysql.com/doc/refman/8.0/en/regexp.html#regexp...

#11 
NightWatch коренной житель21.06.21 14:33
NightWatch
NEW 21.06.21 14:33 
в ответ melodi_ 21.06.21 14:23

[a-zA-Z0-9]{1}[a-zA-Z0-9]{1} = [a-zA-Z0-9]{2}

[a-zA-Z]{0,1} = [a-zA-Z]?

[0-9]{1}[0-9]{0,1}[0-9]{0,1}[0-9]{0,1} = [0-9]{1,4}

#12 
melodi_ постоялец21.06.21 14:46
NEW 21.06.21 14:46 
в ответ NightWatch 21.06.21 14:33

я думаю это не поможет. regexp видит мой стринг как салат и говорит есть ли в нем например огурцы или помидоры. Если там еще носки в салате ему все равно. А мне нужно чтоб он полку видел, где слева на право лежит огурец, огурец, помидор и т.д.

#13 
melodi_ постоялец21.06.21 14:51
NEW 21.06.21 14:51 
в ответ NightWatch 21.06.21 14:33

[a-zA-Z]{0,1} = [a-zA-Z]

к сожалению нет. Все что в скобках например (a), (n) может быть на этом месте в номере, а может и не быть. Поэтому {0,1} Минимально 0, максимально 1

#14 
NightWatch коренной житель21.06.21 14:52
NightWatch
NEW 21.06.21 14:52 
в ответ melodi_ 21.06.21 14:46

Это эквивалентные выражения. Просто чуть короче. Сути не меняет.

Решение твоей проблемы постом выше.

#15 
MrSanders коренной житель21.06.21 14:52
NEW 21.06.21 14:52 
в ответ melodi_ 21.06.21 14:23

'Maria' это просто пример из сети. Но если применить только этот синтакс на номер рейса, то не работает:


fln regexp '[a-zA-Z0-9]{1}[a-zA-Z0-9]{1}[a-zA-Z]{0,1}[0-9]{1}[0-9]{0,1}[0-9]{0,1}[0-9]{0,1}[a-zA-Z]{0,1}'

"Оно не работает" слишком старая шутка. Не смешно.

Что именно "не работает"? Не возвращает 1 для АА0 или не возвращает 0 для 123BBB? Пример данных дайте, с которыми у вас "не работает".

И исправьте выражение как вам выше предложили, сделайте покороче.

#16 
NightWatch коренной житель21.06.21 14:54
NightWatch
NEW 21.06.21 14:54 
в ответ melodi_ 21.06.21 14:51
to match zero or one instance оf the string ari (which is identical to (ari)?),

{0,1} = ?

#17 
MrSanders коренной житель21.06.21 14:56
NEW 21.06.21 14:56 
в ответ NightWatch 21.06.21 14:52
Решение твоей проблемы постом выше.

Слишком быстро. Так ТС ничего не поймёт, скопипастит все эти ^ и $ как мощное колдунство и будет лепить всюду, где что-то не работает :)

#18 
NightWatch коренной житель21.06.21 15:03
NightWatch
NEW 21.06.21 15:03 
в ответ MrSanders 21.06.21 14:56
Слишком быстро.

Посмотрим. Может, придется еще и на помидорах объяснять.

#19 
akidervish постоялец21.06.21 15:04
NEW 21.06.21 15:04 
в ответ melodi_ 21.06.21 14:46
А мне нужно чтоб он полку видел, где слева на право лежит огурец, огурец, помидор и т.д.

Try "substring":


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

#20 
NightWatch коренной житель21.06.21 15:11
NightWatch
NEW 21.06.21 15:11 
в ответ akidervish 21.06.21 15:04

First try it yourself. хаха

#21 
melodi_ постоялец21.06.21 15:20
NEW 21.06.21 15:20 
в ответ MrSanders 21.06.21 14:56
эти ^ и $

Я смотрела что ^ и $ делают. Но я не нашла применения. Ок '^ [a-zA-Z0-9]' можно еще проверять.

Но мой стринг если он трехзначный и заканчивается на '[a-zA-Z]%' то надо 0 -->xx(a), а если 8-значный или 7-6-5-4, то надо 1-->xx(a)n(n)(n)(n)(a). Я думаю надо все таки все варианты с if else????

#22 
akidervish постоялец21.06.21 16:00
NEW 21.06.21 16:00 
в ответ melodi_ 21.06.21 15:20, Последний раз изменено 21.06.21 16:18 (akidervish)

Можно проверить первые две позиции, что на этой субстроке длины два - два метчес для х,
потом третью позицию - если там (а) - отрезать субстроку начиная с 4й позиции до конца, если н - с третьей.
Потом проверить конец (полученной субстроки), и если там (а) - из остатка взять субстроку без последнего элемента, а если н - то оставить как есть.
И в оставшейся в итоге субстроке проверить, что все н, и что длина лежит в [1;4].

#23 
melodi_ постоялец21.06.21 16:07
NEW 21.06.21 16:07 
в ответ akidervish 21.06.21 15:04

Спасибо. Это по крайней мере для трехзначного номера работает:

IF char_length(fln) = 3

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


#24 
melodi_ постоялец21.06.21 16:25
NEW 21.06.21 16:25 
в ответ akidervish 21.06.21 16:00
Можно проверить первые две позиции, что на этой субстроке длины два - два метчес для х,
потом третью позицию - если там (а) - отрезать субстроку начиная с 4й позиции до конца, если н - с третьей.
Потом проверить конец, и если там (а) - из остатка взять субстроку без последнего элемента, а если н - то оставить как есть.
И в оставшейся субстроке проверить, что все н, и что длина лежит в [1;4].


Спасибо. Я думаю мне понятно и код тоже будет в Вашем варианте покороче, но я уже допишу что начато, то есть: Если стринг длинна 3, то проверь это...Если стринг длинна 4, то проверь то ..и т.д. Мне надо побыстрей и дальше, а Ваш вариант я попробую обязательно, когда время будет.

Еще последняй знак в например в 4х значном стринге SUBSTRING('abcd', -1, 1) или SUBSTRING('abcd', 4, 1) или без разницы?

#25 
MrSanders коренной житель21.06.21 16:29
NEW 21.06.21 16:29 
в ответ melodi_ 21.06.21 16:25, Последний раз изменено 21.06.21 16:33 (MrSanders)
Я смотрела что ^ и $ делают. Но я не нашла применения.

Плохо. Давайте попробуем собрать мысли в кучу, и может всё-таки показать нам пример с которым "всё не работает"?


в Вашем варианте покороче, но я уже допишу что начато, то есть: Если стринг длинна 3, то проверь это...Если стринг длинна 4, то проверь то ..и т.д. Мне надо побыстрей и дальше

А вам не кажется что с regexp решение всё-таки покороче, и пишется быстрее чем несколько if-esle?

#26 
akidervish постоялец21.06.21 16:31
NEW 21.06.21 16:31 
в ответ melodi_ 21.06.21 16:25

I would use the variant with -1, as it doesn't depend on the string length.

#27 
melodi_ постоялец21.06.21 16:51
NEW 21.06.21 16:51 
в ответ MrSanders 21.06.21 16:29
Плохо. Давайте попробуем собрать мысли в кучу, и может всё-таки показать нам пример с которым "всё не работает"?

Проблема в том, что у меня нет определенной концовки номера (если номер больше 3 знаков), чтоб с этим ее тестировать. Плюс ко всему regexp видит мой номер как салат. Только substring + regexp.

#28 
NightWatch коренной житель21.06.21 17:12
NightWatch
NEW 21.06.21 17:12 
в ответ melodi_ 21.06.21 14:26
select '55?8777K' regexp '[a-zA-Z0-9]{1}[a-zA-Z0-9]{1}[a-zA-Z]{0,1}[0-9]{1}[0-9]{0,1}[0-9]{0,1}[0-9]{0,1}[a-zA-Z]{0,1}';
-->1((((((((((

Попытка номер три: в твоем же варианте тебе нужно подставить ^ и $ в нужные места, и оно заработает как надо.

#29 
Murr патриот21.06.21 17:21
Murr
NEW 21.06.21 17:21 
в ответ melodi_ 21.06.21 16:51

у меня нет определенной концовки номера (если номер больше 3 знаков), чтоб с этим ее тестировать

------

Тады - оййй,,, Тады проблем не разрешим от слова вааапще... да-да - даже человекоподобным...


Так что вариант - один - изучить необходимое... ну или выбрать другую специальность... безум

#30 
MrSanders коренной житель21.06.21 17:33
NEW 21.06.21 17:33 
в ответ melodi_ 21.06.21 16:51
Проблема в том, что у меня нет определенной концовки номера (если номер больше 3 знаков), чтоб с этим ее тестировать.

Но как-то же вы догадались что "не работает". Как?

#31 
melodi_ постоялец21.06.21 17:40
NEW 21.06.21 17:40 
в ответ NightWatch 21.06.21 17:12
Попытка номер три: в твоем же варианте тебе нужно подставить ^ и $ в нужные места, и оно заработает как надо.

Бля...ну в этом заработает, а в другом нет. хх(а)н(н)(н)(н)(а)(((((

#32 
melodi_ постоялец21.06.21 17:43
NEW 21.06.21 17:43 
в ответ MrSanders 21.06.21 17:33

Сорри... до меня дошло. Ты предлагешь варианты концовок перебрать. Я думала об этом, но там тоже нужен субстринг. Но я в приципе так и делаю, только без ^ и $

#33 
MrSanders коренной житель21.06.21 17:45
NEW 21.06.21 17:45 
в ответ melodi_ 21.06.21 17:40

Почему вы так думаете? Революционное сознание подсказывает? Приведите пример, с которым оно "не заработает".

Да, кстати, а вы вообще понимаете как работает регулярное выражение?

#34 
NightWatch коренной житель21.06.21 17:52
NightWatch
NEW 21.06.21 17:52 
в ответ MrSanders 21.06.21 17:45
Да, кстати, а вы вообще понимаете как работает регулярное выражение?

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

#35 
melodi_ постоялец21.06.21 17:53
NEW 21.06.21 17:53 
в ответ MrSanders 21.06.21 17:45
Да, кстати, а вы вообще понимаете как работает регулярное выражение?

Если сможете объяснить буду очень благодарна, а то тот кто мог(и должен) бы объяснить, сказал у Гугла спрашивать.

#36 
NightWatch коренной житель21.06.21 17:59
NightWatch
NEW 21.06.21 17:59 
в ответ melodi_ 21.06.21 17:53

А, ты же в уни учишься. Там это в порядке вещей.

#37 
melodi_ постоялец21.06.21 18:03
NEW 21.06.21 18:03 
в ответ NightWatch 21.06.21 17:52

Поверь ничего нет. Вот обзор актуальных тем (красным). Синтакс функций да показал, недостатки сказал гуглить. Я так и делаю. Функции с его Лекций пишу, остальное гуглю или сдесь спрашиваю.


#38 
NightWatch коренной житель21.06.21 18:07
NightWatch
NEW 21.06.21 18:07 
в ответ melodi_ 21.06.21 18:03

Ну, уни же. Профессор задает только направление. Студенты занимаются изучением сами.

#39 
melodi_ постоялец21.06.21 18:16
NEW 21.06.21 18:16 
в ответ NightWatch 21.06.21 18:07
Сомневаюсь, что преподаватель на данном этапе хочет выявить студентов, способных хоть частично, рудиментарно реализовать алгоритм для регулярных варажений.

Я подозреваю, более конкретно это буду на модуле "Алгоритмы" проходить, но это только в 2022. Пока я должна ДБ без теории алгоритмов осилить.

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

#40 
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 
NightWatch коренной житель21.06.21 23:50
NightWatch
NEW 21.06.21 23:50 
в ответ NightWatch 21.06.21 23:20
CREATE FUNCTION validate_flight_number(fln varchar(8)) RETURNS int(11)
RETURN if(fln is null, 0, fln regexp '^[[:alnum:]]{2}[[:alpha:]]?[[:digit:]]{1,4}[[:alpha:]]?$')
#61 
melodi_ постоялец22.06.21 00:14
NEW 22.06.21 00:14 
в ответ NightWatch 21.06.21 23:17, Последний раз изменено 22.06.21 00:15 (melodi_)
А вот если бы в конце стояло $, то мы бы имели еще одно правило:

Правило с $ проверяется с права на лево и спотыкается на этом месте из за [0-9]{1}

55A5AAA$B

???


#62 
Murr патриот22.06.21 02:12
Murr
NEW 22.06.21 02:12 
в ответ melodi_ 22.06.21 00:14

$ проверяется с права на лево

-----

Еще есть вариант - сверху вниз... а если не пойдет - снизу вверх...


Может пора начать следовать правилу RTFM? смущ

#63 
Murr патриот22.06.21 02:58
Murr
melodi_ постоялец28.06.21 17:21
NEW 28.06.21 17:21 
в ответ melodi_ 21.06.21 21:44, Последний раз изменено 28.06.21 17:41 (melodi_)

Задание выполнено не правильно, 0 Пунктов((( Буду завтра спрашивать зачем там нужен селект, если функции нужен параметр...но как то так. должно было быть так:

/* c) */

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

BEGIN

DECLARE fieldresult int;

select fln regexp '^[A-Za-z0-9][A-Za-z0-9][A-Za-z]?[0-9][0-9]?[0-9]?[0-9]?[A-Za-z]?$' into fieldresult;

RETURN fieldresult;

END


Мое:

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

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

#65 
1 2 3 4 все