Регулярное выражение для проверки IP-адреса с последней цифрой, отличной от нуля - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть регулярное выражение, которое я использовал в одном из ответов здесь, в SO.В основном, мое регулярное выражение должно проверять адрес ipv4 с маской.

Итак, я использовал следующее регулярное выражение:

(?:(?: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-9]|1[0-9]|2[0-9]|3[0-2]|(((128|192|224|240|248|252|254)\.0\.0\.0)|(255\.(0|128|192|224|240|248|252|254)\.0\.0)|(255\.255\.(0|128|192|224|240|248|252|254)\.0)|(255\.255\.255\.(0|128|192|224|240|248|252|254))))

Теперь моя задача состоит в том, чтобы не допустить 0 в последней цифре ip, т.е. 192.168.6.10/maskдопустимо, но 192.168.6.0/mask неверно

Поэтому я изменил приведенное выше регулярное выражение на что-то вроде этого:

(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[1][0-9][0-9]|[1-9][0-9]|[1-9]?)/([1-9]|1[0-9]|2[0-9]|3[0-2]|(((128|192|224|240|248|252|254)\.0\.0\.0)|(255\.(0|128|192|224|240|248|252|254)\.0\.0)|(255\.255\.(0|128|192|224|240|248|252|254)\.0)|(255\.255\.255\.(0|128|192|224|240|248|252|254))))

, но 192.168.6.0 всегда действует при тестировании с AngularValidators.pattern

Есть идеи, где я ошибаюсь?

РЕДАКТИРОВАТЬ Список IP-адресов и их действительность:

192.168.6.6 / 24 isдействительный 192.168.6.6/24 действительный 192.168.6.24/24 действительный

192.168.6.0 / 24 недействительный 192.168.6.0/255.255.255.0 недействительный

Ответы [ 4 ]

0 голосов
/ 04 февраля 2019

Вы хотите избежать сопоставления любого IP-адреса с последним октетом, установленным на 0.

. Вы можете использовать

ipAddress : FormControl = new FormControl('' , Validators.pattern(/^(?!(?:\d+\.){3}0(?:\/|$))(?:(?: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-9]|1[0-9]|2[0-9]|3[0-2]|(?:(?:128|192|224|240|248|252|254)\.0\.0\.0|255\.(?:0|128|192|224|240|248|252|254)\.0\.0|255\.255\.(?:0|128|192|224|240|248|252|254)\.0|255\.255\.255\.(?:0|128|192|224|240|248|252|254)))$/));

. Вот демо regex

Основным дополнением является предварительный просмотр после ^, который выполняется один раз в начале строки.Шаблон (?!(?:\d+\.){3}0(?:\/|$)) представляет собой отрицательный запрос на просмотр, который не соответствует совпадению, если непосредственно справа от текущего местоположения (начало строки):

  • (?:\d+\.){3} -три повторения из 1+ цифр и точки
  • 0 - ноль
  • (?:\/|$)) - / или (|) конец строки ($).

Обратите внимание, что я определил шаблон, используя буквенное обозначение regex (/regex/), и мне пришлось добавить якоря ^ (начало строки) и $ (конец строки)поскольку регулярное выражение больше не было привязано по умолчанию.Кроме того, чтобы избежать специальных символов в буквенной нотации регулярного выражения, вам нужен только один обратный слеш, а не два.

0 голосов
/ 04 февраля 2019

Один из возможных подходов здесь прост и включает в себя добавление отрицательного взгляда в конец самого шаблона (?<!\.0), который утверждает, что .0 не является непосредственно предшествующим термином в 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-9]|1[0-9]|2[0-9]|3[0-2]|(((128|192|224|240|248|252|254)\.0\.0\.0)|
    (255\.(0|128|192|224|240|248|252|254)\.0\.0)|
    (255\.255\.(0|128|192|224|240|248|252|254)\.0)|
    (255\.255\.255\.(0|128|192|224|240|248|252|254))))(?<!\.0)$

Демо

Недостатком является то, что ваш движок JavaScriptможет еще не поддерживать отрицательный синтаксис lookhehind.

0 голосов
/ 04 февраля 2019

Предположим, что последняя часть не может быть записана 000 и 00, а просто 0.Тогда вы можете вы такое регулярное выражение

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

Где разница между первой и последней группы, что однозначное значение должно быть от 1 до 9

демо

0 голосов
/ 04 февраля 2019

Вы можете попробовать с этим шаблоном

^(?:[1-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.(?:[1-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.(?:[1-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.(?:2[0-5][1-5]|[1-9]|1[0-9][1-9]|[1-9][1-9])$

Онлайн демо

Последние номера, которые вы проверяли с этим

(?:2[0-5][1-5]|[1-9]|1[0-9][1-9]|[1-9][1-9])

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...