регулярное выражение для проверки ip-диапазона из списка ip-адресов


У меня есть регулярное выражение для проверки списка из 50 IP-адресов, разделенных запятыми:

^(?:(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?:,? ?)){1,50}$

Пример списка:

10.10.10.1,127.0.0.1

Теперь мне нужно поддержать список, как это:

10.10.10.1,127.0.0.1-127.0.0.125

Я пытаюсь, использовать подшаблоны, но ничего не получилось

Может ли кто-нибудь привести пример регулярного выражения для проверки этой строки:

127.0.0.1-127.0.0.125
1 4

1 ответ:

Здесь можно использовать 2 вещи: использовать класс отрицаемых символов, чтобы соответствовать либо ,, либо -, и использовать вызов подстроки, чтобы убедиться, что ваш шаблон остается разумного размера и строка не может начинаться с , или -:

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

Смотрите демонстрацию регулярных выражений

Подробности :

  • ^ - начало строки
  • ((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)) - Группа 1 захватывает 1 IP-адрес
  • (?:[,-](?1)){0,49} - от 0 до 49 (поскольку подшаблон выше уже соответствовал 1 IP, он будет суммироваться всего до 50) последовательностей:
    • [,-] - класс символов, соответствующий либо ,, либо -
    • (?1) - вызов подпрограммы, который "повторяет" подшаблон группы 1 (в отличие от backreference, который соответствует тому же значению , захваченному с группой захвата)
  • $ - конец строки