Проверка IP адреса регуляркой
Пользователь вводит агрумент к скрипту IP адрес, подскажите как при помощи регулярок проверить корректность ввода IP адреса?
Отслеживать
149k 12 12 золотых знаков 59 59 серебряных знаков 132 132 бронзовых знака
задан 16 авг 2017 в 11:44
Никола Кривошея Никола Кривошея
1,487 4 4 золотых знака 34 34 серебряных знака 71 71 бронзовый знак
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
67.9k 216 216 золотых знаков 77 77 серебряных знаков 219 219 бронзовых знаков
уверен, что 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 11 11 серебряных знаков 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
WebSite Laboratory
Современные веб-технологии предоставляют разработчикам неограниченные возможности для реализации своих идей. Для того, чтобы вы могли использовать весь их потенциал, необходимо знать как правильно их использовать. На этой странице мы постарались собрать ссылки на документацию по различным технологиям, которые могут быть вам полезны.
HTML
Язык гипертекстовой разметки — это язык, используемый для определения структуры и описания содержания веб-страницы в структурированной форме.
CSS
Каскадные таблицы стилей используются для описания внешнего вида веб-контента.
JavaScript
JavaScript — язык программирования, широко используемый для реализации взаимодействия пользователя с веб-сайтами и приложениями.
SVG
Масштабируемая векторная графика позволяет вам описать изображение как набор векторов (линий) и фигур, что позволяет масштабировать такую графику плавно независимо от размеров, в которых она нарисована без потерь качества.
Руководство веб-разработчика
Руководство веб-разработчика предоставляет полезные пошаговые материалы, которые помогут вам в полной мере использовать веб-технологии для выполнения ваших задач и реализации ваших идей.
Учебные материалы для веб-разработчиков
Перечень учебных материалов позволит вам пошагово изучить API, технологии и расширить свой кругозор в области веб-технологий.
Справочные материалы
На данной странице будут представлены ссылки на всю справочную информацию, имеющуюся в MDN; а пока можно использовать ссылки на веб-технологии из левой части данной страницы.
регулярные выражения: проверка 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-адрес с помощью регулярного выражения
Целая комбинация означает цифру от 0 до 255, за которой следует точка «.», Повторение 4 раза и завершение без точки «.». Допустимый формат IP-адреса: «0-255.0-255.0-255.0-255».
1. Пример регулярного выражения Java
package com.csharpcoderr.regex; import java.util.regex.Matcher; import java.util.regex.Pattern; public class IPAddressValidator < private Pattern pattern; private Matcher matcher; private static final String IPADDRESS_PATTERN = "^([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])$"; public IPAddressValidator()< pattern = Pattern.compile(IPADDRESS_PATTERN); >/** * Validate ip address with regular expression * @param ip ip address for validation * @return true valid ip address, false invalid ip address */ public boolean validate(final String ip) < matcher = pattern.matcher(ip); return matcher.matches(); >>
2. IP-адрес, который соответствует:
1. «1.1.1.1», «255.255.255.255», «192.168.1.1»,
2. «10.10.1.1», «132.254.111.10», «26.10.2.10»,
3. «127.0.0.1»
3. IP-адрес, который не совпадает:
1. «10.10.10» — должно иметь 4 «.»
2. «10.10» — должно иметь 4 «.»
3. «10» — должно иметь 4 «.»
4. «аааа» — разрешена только цифра
5. «10.0.0.a» — разрешена только цифра
6. «10.10.10.256» — цифра должна быть между [0-255]
7. «222.222.2.999» — цифра должна быть между [0-255]
8. «999.10.10.20» — цифра должна быть между [0-255]
9. «2222.22.22.22» — цифра должна быть между [0-255]
10. «22.2222.22.2» — цифра должна быть между [0-255]
ЧИТАТЬ ТАКЖЕ: Пример Apache Solr Hello World
4. Модульный тест
package com.csharpcoderr.regex; import org.testng.Assert; import org.testng.annotations.*; /** * IPAddress validator Testing * @author mkyong * */ public class IPAddressValidatorTest < private IPAddressValidator ipAddressValidator; @BeforeClass public void initData()< ipAddressValidator = new IPAddressValidator(); >@DataProvider public Object[][] ValidIPAddressProvider() < return new Object[][]< new Object[] ,new Object[] , new Object[] ,new Object[] , new Object[] ,new Object[] , new Object[] >; > @DataProvider public Object[][] InvalidIPAddressProvider() < return new Object[][]< new Object[] ,new Object[] , new Object[] ,new Object[] , new Object[] ,new Object[] , new Object[] ,new Object[] , new Object[] ,new Object[] , new Object[] ,new Object[] , >; > @Test(dataProvider = "ValidIPAddressProvider") public void ValidIPAddressTest(String ip) < boolean valid = ipAddressValidator.validate(ip); System.out.println("IPAddress is valid : " + ip + " , " + valid); Assert.assertEquals(true, valid); >@Test(dataProvider = "InvalidIPAddressProvider", dependsOnMethods="ValidIPAddressTest") public void InValidIPAddressTest(String ip) < boolean valid = ipAddressValidator.validate(ip); System.out.println("IPAddress is valid : " + ip + " , " + valid); Assert.assertEquals(false, valid); >>
5. Модульный тест — результат
IPAddress is valid : 1.1.1.1 , true IPAddress is valid : 255.255.255.255 , true IPAddress is valid : 192.168.1.1 , true IPAddress is valid : 10.10.1.1 , true IPAddress is valid : 132.254.111.10 , true IPAddress is valid : 26.10.2.10 , true IPAddress is valid : 127.0.0.1 , true IPAddress is valid : 10.10.10 , false IPAddress is valid : 10.10 , false IPAddress is valid : 10 , false IPAddress is valid : a.a.a.a , false IPAddress is valid : 10.0.0.a , false IPAddress is valid : 10.10.10.256 , false IPAddress is valid : 222.222.2.999 , false IPAddress is valid : 999.10.10.20 , false IPAddress is valid : 2222.22.22.22 , false IPAddress is valid : 22.2222.22.2 , false PASSED: ValidIPAddressTest([Ljava.lang.String;@1d4c61c) PASSED: InValidIPAddressTest([Ljava.lang.String;@116471f) =============================================== com.csharpcoderr.regex.IPAddressValidatorTest Tests run: 2, Failures: 0, Skips: 0 =============================================== =============================================== mkyong Total tests run: 2, Failures: 0, Skips: 0 ===============================================