JS. Регулярные выражения . Валидация ip адреса

задача валидировать ip адрес.

Требования по адресам:

  1. 0.0.0.0:443
  2. 10.54.42.114
  3. 255.255.255.255:7777
  4. 10.60.48.0/20
  5. 10.102.0.0/16
  6. 185.71.77.0/27
  7. 77.75.154.128/25

Мой вариант регулярного выражения учитывает требования : 1, 2, 3, а вот с остальными 4 никак не выходит.
С регулярными выражениями дружу плохо, поэтому буду благодарен за помощь, надо учитывать все 7 вариантов.

Мой код для проверки

const ips = ['0.0.0.0:443', '10.54.42.114', '255.255.255.255:7777', '10.60.48.0/20', '10.102.0.0/16', '185.71.77.0/27', '77.75.154.128/25'];

const regexp_ip_validation = /^((25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\.){3}((25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d))(:([1-9]\d{1,3}|[1-6]\d{4}))?$/;

for (const ip of ips) {
  console.log(ip, ' --- ', regexp_ip_validation.test(ip));
}


Ответы (1 шт):

Автор решения: Wiktor Stribiżew

Ошибка в том, что в вашем регулярном выражении нет поддержки символа косой черты как разделителя между IP-адресом и маской подсети.

Замените : на [\/:] и используйте

/^(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)(?:[\/:]([1-9]\d{1,3}|[1-6]\d{4}))?$/

Я заменил захватывающие подмаски незахватывающими.

const ips = ['0.0.0.0:443', '10.54.42.114', '255.255.255.255:7777', '10.60.48.0/20', '10.102.0.0/16', '185.71.77.0/27', '77.75.154.128/25'];

const regexp_ip_validation = /^(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)(?:[\/:]([1-9]\d{1,3}|[1-6]\d{4}))?$/;

for (const ip of ips) {
  console.log(ip, ' --- ', regexp_ip_validation.test(ip));
}

→ Ссылка