SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 22.01.2011 22:14:06

Step
Участник
Зарегистрирован: 22.01.2011
Сообщений: 6

Проблемы с регуляркой

Задание сделать регулярку для ip Вот такого вида: http://%ip%/path/to/page
Например: http://64.106.42.83/index.php или http://34.62.10.99/page2/

набросал такое

select 'http://54.255.5.255/df.' regexp
'^http[:][/][/](([0-1]?[0-9]{1,2})|([2]?[0-4]?[0-9]?)|([2]?[5]?[0-5]?))[.](([0-1]?[0-9]{1,2})|([2]?[0-4]?[0-9]?)|([2]?[5]?[0-5]?))[.](([0-1]?[0-9]{1,2})|([2]?[0-4]?[0-9]?)|([2]?[5]?[0-5]?))[.](([0-1]?[0-9]{1,2})|([2]?[0-4]?[0-9]?)|([2]?[5]?[0-5]?))([/][.A-Za-z]+)*$';

сказали доделать вот это

В ip-адресе не может встречаться 255. И сделай так, чтобы у тебя не могло
оканчиваться точкой.

вопрос в следующем максимальный ip у нас 253.255.255.255 ? 

и как разобраться с точкой и так же как сделать так что бы айпишник не мог оканчиваться на /

Неактивен

 

#2 22.01.2011 22:36:19

Step
Участник
Зарегистрирован: 22.01.2011
Сообщений: 6

Re: Проблемы с регуляркой

научил запрещать /   и чуть упростил но с окончанием на точку не разобрался...

^http[:][/][/](25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)([/][\].A-Za-z]+)*$

Неактивен

 

#3 22.01.2011 23:05:55

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Проблемы с регуляркой

Честно говоря, не понял, почему нельзя 255 в адресе. Вполне можно.
Что значит «айпишних заканчивается на /» — тоже не понял. У Вас
там только числа прописаны. С / начинается path, при этом / — вполне
себе валидный путь к файлу.

Из общих придирок — я бы избавился от дублирования строк: регуляр-
ные выражения и так читать достаточно сложно smile
((...)\.){3}(...)

Т.е. я бы делал что-то типа
^http://((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])/([A-Za-z0-9/_\\-]+)*$

Обратите внимание, что внутренние скобки Ваши я тоже немного
поправил, потому что октет 0101 хоть и является валидным, но
представляет собой число 65, а если Вы хотите поддерживать вось-
меричную нотацию, то тогда надо расширять все остальные поля
тоже wink

Неактивен

 

#4 23.01.2011 00:42:59

Step
Участник
Зарегистрирован: 22.01.2011
Сообщений: 6

Re: Проблемы с регуляркой

ох загрузили))))))) надо ещё мне теории почитать)))))))))

может через глупую фигню проверяю но все таки ваш вариант тут "компилиться" не хочет


Ваш вариант здесь

Отредактированно Step (23.01.2011 00:48:54)

Неактивен

 

#5 23.01.2011 14:43:42

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Проблемы с регуляркой

Код:

[silentia] root test > select r, r rlike '^http://((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])/([A-Za-z0-9/_\\-]+)*$' m from r;
+----------------------+------+
| r                    | m    |
+----------------------+------+
| http://1.2.3.4/blah  |    1 |
| http://1.2.3.4.5/bla |    0 |
| http://1.2.3./blah   |    0 |
| http:/1.2.3.4/blah   |    0 |
| http://1000.2.3.4/bl |    0 |
+----------------------+------+
5 rows in set (0.00 sec)

А что касается проверки на сайте PCRE — решите, какие регулярные
выражения Вам нужны, а потом уже пишите их wink

Неактивен

 

#6 23.01.2011 19:35:27

Kos
Участник
Зарегистрирован: 23.01.2011
Сообщений: 5

Re: Проблемы с регуляркой

Присоединюсь к топику , но со своей регуляркой :
select 'https://y.a.ndexf.ri/gggghhh;' REGEXP
'(http|https|ftp)hmm/(www|ftp)*[A-z0-9\-]+\\.([A-z]){2,5}[/]*[A-z0-9\-]';

ну и два вопроса :
1) почему не пускает ?
2) нужно учесть ограничения доменов 2 уровня
спасибо

Неактивен

 

#7 23.01.2011 23:51:21

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Проблемы с регуляркой

А почему должен? :)
У Вас написано: протокол, «://», префиксы несколько раз, слово, точка, от двух до пяти букв, итд.
Подставляем. https (ok), :// (ok), префиксов нет (ok), слово y (ok), точка (ok), одна буква (облом).

Неактивен

 

#8 24.01.2011 04:24:39

Kos
Участник
Зарегистрирован: 23.01.2011
Сообщений: 5

Re: Проблемы с регуляркой

select 'http://y.andex.ru/gggghhh;' REGEXP
'(http|https|ftp)hmm/(www|ftp)*[A-z0-9\-]+\.([A-z]){2,5}[/]*[A-z0-9\-];
а вот это работает
1)как мне быть со второй точкой ?(y.a.ndexf) что нужно добавить чтобы и ее пропускало ?
2)нужно учесть , что домен второго  уровня не может начинаться и заканчиваться на   -
спасибо

Неактивен

 

#9 24.01.2011 12:44:01

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Проблемы с регуляркой

А домен третьего уровня может начинаться с минуса? Если да — что-то такое:

([A-Za-z0-9\\-_]+\\.)*[A-Za-z0-9_][A-Za-z0-9\\-_]*[A-Za-z0-9_]\\.[A-Za-z]+

Неактивен

 

#10 24.01.2011 13:19:51

Kos
Участник
Зарегистрирован: 23.01.2011
Сообщений: 5

Re: Проблемы с регуляркой

Уважаемый Paulus,  я новичок в этом деле и ,честно ,вы меня запутали еще больше )
не могли бы вы прокомментировать , что вы изменили/добавили ?

Неактивен

 

#11 24.01.2011 15:22:28

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Проблемы с регуляркой

Я написал заново wink

Домен состоит из слов, разделенных точками. Слова состоят из букв, цифр,
знаков минус и подчеркиваний. У Вас есть дополнительное ограничение, не
имеющее отношение к реальности: домен второго уровня не имеет знаков
минус в начале и конце. Домены второго уровня не бывают однобуквенными,
поэтому мы можем считать, что два символа уж там есть.

Соответственно и пишется регулярное выражение:
«слово» ~ [A-Za-z0-9\\-_]+
«несколько слов, разделенных точкой» ~ ([A-Za-z0-9\\-_]+\\.)*
«домен второго уровня» ~ [A-Za-z0-9_][A-Za-z0-9\\-_]*[A-Za-z0-9_]

Кстати, я ступил, считая, что в домене первого уровня могут быть
только буквы. Поэтому сделаем его просто словом. Итого:
([A-Za-z0-9\\-_]+\\.)*[A-Za-z0-9_][A-Za-z0-9\\-_]*[A-Za-z0-9_]\\.[A-Za-z0-9\\-_]+

Неактивен

 

#12 25.01.2011 17:47:45

Kos
Участник
Зарегистрирован: 23.01.2011
Сообщений: 5

Re: Проблемы с регуляркой

снова я
select 'https://jhk/asssssss' regexp '^(https|http|ftp)hmm/(www|ftp)?([[:alnum:]]|\\.){0,2}([[:alnum:]|\\-|\\.])*([[:alnum:]|\\.]){0,2}([[:alpha:]]){2,5}/([[:alnum:]])*([[:alnum:]]|\\-)*([[:alnum:]])*$';
1)нужно  сделать так , чтобы перед  jhk  нельзя было ставить точки (не пропускало)
2) чтобы нельзя было ставить две и более точки и два и более -    подряд(между ними должен быть символ  буквы/числа)

Неактивен

 

#13 25.01.2011 20:44:34

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Проблемы с регуляркой

Второе ограничение опять не естественное — в URL бывают два минуса подряд.
Например, «яндекс.рф» эквивалентно «xn--d1acpjx3f.xn--p1ai».

По первому — ищите места,  где у Вас стоит * или {0,} — именно в этих местах
Вы допускаете наличие пустого набора символов. Ограничение домена первого
уровня у Вас {2,5} — тоже не рабочее (тот же пример с .рф).

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson