регулярные выражения: проверка ip на корректность
Существует, казалось бы, тривиальная задача: с помощью регулярного выражения проверить корректность введённого ip. На ум приходят сразу 2 варианта:
Правда, оба не лишены недостатков. Каких? Для начала определим, что есть ip? Это некий уникальный адрес узла в сети, по которому можно однозначно идентифицировать данный узел. В машинном виде адрес представляет собой обычное 4-байтовое число, что неудобно для записи человеком. Поэтому была принята запись, вида AAA.BBB.CCC.DDD, значения байтов записываются через точку (байт состоит из 8 битов, каждый из которых может принимать значение 0 или 1. Таким образом, максимально возможное число вариантов 2 8 , чему соответствует 256 разных значений — от 0 до 255 включительно в десятичном виде, или от 00 до FF в шестнадцетиричном). Итого: диапазон всех адресов лежит в пределах 0.0.0.0 и 255.255.255.255.
Если вернуться к написанным выше регулярным выражениям, убеждаемся, что любой из указанных в предыдущем абзаце адресов проверку проходит. Правда, пройдут проверку и 256.256.256.256, и 999.999.999.999 (которые, хотя по структуре и похожи, ip-адресами не являются). Таким образом, нужно как-то ограничить максимальные значения. Однако стоит учесть, что следующий адрес 001.020.130.240 также является корректным (т. к. начальные нули не учитываются). Ну и, наконец, коли уж ip соотоит из 4-ёх чисел в диапазоне 0–255, разделённых точкой, для начала можно составить регулярное выражение для одной секции, после чего повторить его 4 раза. Код секции будет таким:
(25[0-5]|2[0-4][0-9]|[0-1][0-9]|[0-9]|[0-9])
Если разобрать каждую из возможных частей, получим следующие диапазоны значений:
25[0-5] 250–255 2[0-4][0-9] 200–249 [0-1][0-9] 000–199 [0-9] 00–99 [0-9] 0–9
Таким образом, данное регулярное выражение описывает все возможные комбинации записи одной секции ip-адреса (одного байта). Полный же код будет таким:
^(25[0-5]|2[0-4][0-9]|[0-1][0-9]|[0-9]|[0-9])(\.(25[0-5]|2[0-4][0-9]|[0-1][0-9]|[0-9]|[0-9]))$
Отсюда можно скопировать готовый код для вставки в скрипт:
Поддержка сайта
С удовольствием создаю годный контент. Буду очень признателен, если вы поддержите мои усилия:
Свежим хлебушком типа батон —>
днём интернета
шоколадкой для работы мозга
коробочкой ароматного чая для бодрости продлением домена —>
продлением хостинга на +1 месяц
Проверка IP адреса регуляркой
Пользователь вводит агрумент к скрипту IP адрес, подскажите как при помощи регулярок проверить корректность ввода IP адреса?
Отслеживать
149k 12 12 золотых знаков 59 59 серебряных знаков 133 133 бронзовых знака
задан 16 авг 2017 в 11:44
Никола Кривошея Никола Кривошея
1,497 4 4 золотых знака 34 34 серебряных знака 72 72 бронзовых знака
IP v4, IP v6, IP v4 & v6 ?
16 авг 2017 в 11:50
Какие вообще требования к корректному IP-адресу в целом?
16 авг 2017 в 12:11
А зачем?! Неужели не хватает нормальной утилиты, чтобы этим заниматься? man ipcalc , man ipv6calc .
18 авг 2017 в 15:57
5 ответов 5
Сортировка: Сброс на вариант по умолчанию
довольно корректное выражение для проверки ipv4-адресов:
1.2.3.0 0.0.0.256 x.y.z.t 1. 1 1.1.1 1.1.1.1.1 1000.1.1.1 1.2.3.04 и т.п.
чтобы пропускало и адреса, в последнем октете которых написан ноль (см. дискуссию в комментариях), надо переставить последний ? чуть левее:
- -E — опция программы grep, включающая режим extended regexp. в данном случае используется лишь для того, чтобы не загромождать выражение обратными слэшами
- -q — опция программы grep, благодаря которой программа ничего не запишет в stdout, а лишь вернёт код возврата (совпадение есть — вернёт 0, иначе — вернёт не ноль)
- ^. $ — привязка к началу и концу строки
- (. ) — группа
- (. ) — группа должна повториться ровно три раза
- (выражение1|выражение2|. ) — должно совпасть или выражение1 или выражение2 или .
- [. ] — любой из перечисленных символов («набор»)
- [0-5] — любая из цифр от нуля до пяти
- x? — символ x может встретиться ноль или один раз («символом» в данном случае может быть и группа (. ) и набор символов [. ]
- \. — символ «точка» (без обратного слэша точка является квантификатором, совпадающим с любым (одним) символом)
Отслеживать
ответ дан 16 авг 2017 в 13:29
aleksandr barakin aleksandr barakin
68.2k 225 225 золотых знаков 80 80 серебряных знаков 223 223 бронзовых знака
уверен, что 1.2.3.0 не валидный ip-адрес?
16 авг 2017 в 13:36
@ArcherGodson whois 1.2.3.0 >> «This IP address range is not registered in the ARIN database. For details, refer to the APNIC Whois Database via WHOIS.APNIC.NET or wq.apnic.net/apnic-bin/whois.pl»
16 авг 2017 в 13:46
# whois 1.2.3.0 % [whois.apnic.net] % Whois data copyright terms apnic.net/db/dbcopyright.html % Information related to ‘1.2.3.0 — 1.2.3.255’ % Abuse contact for ‘1.2.3.0 — 1.2.3.255’ is ‘[email protected]’ inetnum: 1.2.3.0 — 1.2.3.255 netname: Debogon-prefix descr: APNIC Debogon Project descr: APNIC Pty Ltd . смени хуиз
16 авг 2017 в 13:53
можно зайти с другой стороны, 192.168.100.0 точно не валидный? а 192.168.1.1?
16 авг 2017 в 13:56
@ArcherGodson, 1.2.3.0 и 192.168.100.0 — да, думаю, для хоста они невалидны. 192.168.1.1 — спасибо, поправил опечатку.
16 авг 2017 в 14:11
echo "$IP" | grep -E "([0-9][\.])[0-9]"
если хватит проверки четырёх трёхзначных чисел через точку, без проверки на превышение 255 и валидности и соответствия «белым»-«серым» диапазонам.
Ещё можно сделать whois «$IP» , в русской локализации на невалидный адрес whois всегда возвращает:
Нет whois-сервера для объектов данного вида.
это работает и для локальных адресов, и для доменных имён.
Отслеживать
ответ дан 16 авг 2017 в 11:53
ArcherGodson ArcherGodson
2,979 12 12 серебряных знаков 23 23 бронзовых знака
Комментарии не предназначены для расширенной дискуссии; разговор перемещён в чат.
– user177221
16 авг 2017 в 21:49
Убедиться, что IP-адрес записан правильно, можно вот такой регуляркой (взято отсюда). Это выражение допускает и IPv4, и IPv6 адреса.
(([0-9a-fA-F]:)[0-9a-fA-F]|([0-9a-fA-F]:):|([0-9a-fA-F]:):[0-9a-fA-F]|([0-9a-fA-F]:)(:[0-9a-fA-F])|([0-9a-fA-F]:)(:[0-9a-fA-F])|([0-9a-fA-F]:)(:[0-9a-fA-F])|([0-9a-fA-F]:)(:[0-9a-fA-F])|[0-9a-fA-F]:((:[0-9a-fA-F]))|:((:[0-9a-fA-F])|:)|fe80:(:[0-9a-fA-F])%[0-9a-zA-Z]|::(ffff(:0):)((25[0-5]|(2[0-4]|1[0-9])[0-9])\.)(25[0-5]|(2[0-4]|1[0-9])[0-9])|([0-9a-fA-F]:):((25[0-5]|(2[0-4]|1[0-9])[0-9])\.)(25[0-5]|(2[0-4]|1[0-9])[0-9]))|((25[0-5]|(2[0-4]|1[0-9])[0-9])\.)(25[0-5]|(2[0-4]|1[0-9])[0-9])
А вот пример сценария для командного интерпретатора.
ip_regex='(([0-9a-fA-F]:)[0-9a-fA-F]|([0-9a-fA-F]:):|([0-9a-fA-F]:):[0-9a-fA-F]|([0-9a-fA-F]:)(:[0-9a-fA-F])|([0-9a-fA-F]:)(:[0-9a-fA-F])|([0-9a-fA-F]:)(:[0-9a-fA-F])|([0-9a-fA-F]:)(:[0-9a-fA-F])|[0-9a-fA-F]:((:[0-9a-fA-F]))|:((:[0-9a-fA-F])|:)|fe80:(:[0-9a-fA-F])%[0-9a-zA-Z]|::(ffff(:0):)((25[0-5]|(2[0-4]|1[0-9])[0-9])\.)(25[0-5]|(2[0-4]|1[0-9])[0-9])|([0-9a-fA-F]:):((25[0-5]|(2[0-4]|1[0-9])[0-9])\.)(25[0-5]|(2[0-4]|1[0-9])[0-9]))|((25[0-5]|(2[0-4]|1[0-9])[0-9])\.)(25[0-5]|(2[0-4]|1[0-9])[0-9])' if echo "$param" | egrep -q "$ip_regex"; then // теперь в переменной $param что-то похожее на IP-адрес . fi
Как сделать валидацию ip адреса и порта с помощью регулярного выражения?
/\d+\.\d+\.\d+\.\d+:\d+/ — в простейшем случае (валидация только формата).
если нужна и проверка корректности данных (например, фейл на адресе 123.456.789.100), то:
/^([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5]):((6553[0-5])|(655[0-2][0-9])|(65[0-4][0-9])|(6[0-4][0-9])|([1-5][0-9])|([0-5])|([0-9]))$/
Как проверить в регулярном выражение ip адрес на java?
Помогите модернизировать регулярное выражение с таким условием
1.(шаблон xxx.xxx.xxx.xxx) могут указыватся через , это уже сделано (?=^(((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]?(,|$)?))*$)(?=^.[^,\s]$)|^$
2.или с использованием символа-подстановки «*» в последнем октете (шаблон xxx.xxx.xxx.*)
3.или использованием начального и конечного значения диапазона и только в последнем октете (шаблон xxx.xxx.xxx.0-xxx.xxx.xxx.255)
- Вопрос задан более года назад
- 341 просмотр
6 комментариев
Простой 6 комментариев
А можно просто набор строк, которые должны быть валидными и наоборот?
Dimonchik @dimonchik2013
ха-ха, да-а-а-а. запятую чОтко вставил
Kentaro23 @Kentaro23 Автор вопроса
Валидные строки
10.80.212.195
10.80.212.*
10.80.212.0-10.80.212.255
Не валидные все строки которые не относятся к ip адресу или октет больше 255
Например 10.82.212.300
Kentaro23, У ваших руках такой мощный интсрумент как ява а вы ип адрес регекспом маловато ?
mayton2019 @mayton2019 Куратор тега Java
Мда. А ведь это просто IPv4. Могло-бы быть и IPv6.
Кстати регулярок недостаточно чтобы проверять семантику IP-блоков. Например такой блок 10.80.212.0-10.80.212.255 или ему подобный может проходить валидацию через регулярки но при этом он будет не валидный с точки зрения смысла.
Кстати для факультатива задачка. IP адреса могут иметь еще несколько форм записи. Например
20.53.203.50 — десятичная с точкой
339069746 — просто десятичная
0x1435CB32 — hex
все они пингуются утилитой ping и раньше даже открывались браузерами как адреса. Сейчас к сожалению
такая нотация не используется. А зря. Было-бы проще не пробивать башкой десятичные нотации с точкой.
Kentaro23 @Kentaro23 Автор вопроса
сергей кузьмин, Ну не совсем так, из бэка(джава) запрашивается строка в котором находится регулярное выражение, а на фронте оно уже реализуется в конкретном поле.