Validate IP address

Albert Davletov
UniLecs
Published in
2 min readNov 4, 2021

Задача: для заданной строки верните:

  • “IPv4”, если строка является валидным Ipv4 адресом.
  • “IPv6”, если строка является валидным Ipv6 адресом.
  • “Error”, если не является валидным IP-адресом любого типа.

Входные данные: str — исходная строка содержит только символы английского алфавита, цифры, а также символы ‘.’, ‘:’

Справка:

  • IPv4-адрес — это IP-адрес в формате «x1.x2.x3.x4», где 0 <= xi <= 255 и xi не может содержать начальные нули.
  • IPv6-адрес — это IP-адрес в форме «x1:x2:x3:x4:x5:x6:x7:x8», где 1 <= xi.length <= 4, xi — это шестнадцатеричная строка, которая может содержать цифры, строчные английские буквы (от «a» до «f») и заглавные английские буквы (от «A» до «F»). В xi разрешены ведущие нули.

Примеры:

  1. «192.168.1.1»
    Output: “IPv4”
  2. «192.168.01.1»
    Output: “Error”
  3. «2001:0db8:85a3:0000:0000:8a2e:0370:7334»
    Output: “IPv6”
  4. «2001:0db8:85a3::8A2E:037j:7334"
    Output: “Error”

Разбор

Применяем принцип разделяй и властвуй:

  1. Разбиваем строку на блоки, разделенные символами ‘.’ или ‘:’.
  2. Если кол-во блоков равно 4 -> используем функцию для валидации IPv4.
  3. Если кол-во блоков равно 8 -> используем функцию для валидации IPv6.
  4. В противном случае, сразу возвращаем сообщение об ошибке.

Функция для валидациия IPv4:

  • Каждый из 4х блоков проверяем на валидность.
  • Каждый блок должен быть не меньше 1 и не больше 3х символов.
  • Каждый блок должен быть числом от 0 до 255, а также не должно быть начальных нулей.

Функция для валидации IPv6:

  • Каждый из 8 блоков проверяем на валидность.
  • Размер каждого блока должен быть не меньше 1 и не больше 4х символов.
  • Каждый блок может содержать цифры [0–9] или буквы [a-f, A-F].

Реализация

C#

Весь код тут:
https://gist.github.com/unilecs/90d9b8a6dd3e4d3041caa60b0b19dad9

Play-test

https://dotnetfiddle.net/ONaJxK

--

--