Проверить формат varchar. my SQL
Что то не так:(((
Я тестирую вариант: 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, что не есть правда.
Значит, тема была.
-----
Так в "теме" основное не то что она была, а как ее донесли...
и докопался ли студент после того как "тема была" до понимания вопроса.
Пока что наблюдается что студент просто прошел мимо вопроса...
и даже не имеет чем его подумать... ![]()
Способ решения задачи - перебирать наборы значков до получения решения
- не работает в виду большого количества означенных значков...
Пока я должна ДБ без теории алгоритмов осилить.
-----
В твоем вопросе от ДБ - только СЕЛЕКТ. Ну а СЕЛЕКТ в ДБ - 1-2% от того что надо и знать, и понимать...
По РЕГЭКСПу... посмотри сайт где можно его отлаживать - все быстрее пойдет перебор вариантов...
если я не ошибаюсь
-----
Ошибаешься.
Как упрощённо представить себе работу жадного (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.
Так понятнее? А теперь, прежде чем говорить что регулярное выражение "не работает", найдите пример, с которым оно работает не так, как вы ожидали.
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;
Теперь работает.
-----
https://www.w3schools.com/sql/func_mysql_substring.asp
Минус две буквы, говоришь? Хи-хи...
И ведь это потом надо будет кому-то учить программировать... ![]()
Ты полагаешь что никто до тебя не мог написать нужное по заданию?
Все пытались заставить ТС хоть немного начать думать и дойти до понимания что и как надо делать...
Признаю, что надо было прислушаться раньше и нельзя самой ничего допридумывать ...((( Прочитав это..
^
^ 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 |
+----------------------+.
я придумала, что длинна стринга делится попалам и с '^' проверяеться первая часть, а с '$' вторая(хвост). Еще задавалась вопросом, а что с серединой. Ужос.
Как упрощённо представить себе работу жадного (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.
Так понятнее? А теперь, прежде чем говорить что регулярное выражение "не работает", найдите пример, с которым оно работает не так, как вы ожидали.
Спасибо большое. Вам бы вместо нашего Профа надо! Теперь понятно, что можно с этим делать. Очень эффективно работает.
Попытку что-то объяснить
-----
Не всегда требуется объяснять.
Точнее - не очень полезно, с точки зрения развития, давать детальные разъяснения.
Гораздо продуктивнее - подводить к вопросам которые надо изучить и давать возможность это сделать, корректируя только ту часть, где понято неправильно.
В данном случае - чел не понимает практически ничего и подставив решение в задачу останется таким же непонимающим.
Потом ему надо будет как-то делать работу. Непонимая ни с чем работает, ни что делает, ни как может/должно быть...
Ну ответ я написал пока листал 1-ю страницу.
-----
Возьми в голову - не надо писать ответ. Надо писать что надо изучить для... ![]()
Что есть, то есть. Но ситуация еще хуже...Теперь правда мне стыдно. Когда все так объяснил...я все равно не правильно что то сделала. Вернее я получаю не то, что ожидаю:
Мое слово: 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 ;
Получаем на вход строчку: '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
Конец строки. А - это не конец строки. Облом.
"Откаты" я не описáл,
но и так должно быть понятно, что совпадений не будет.

