Различать регулярное выражение IPv4 и IPV6 - соответствие для: достаточно?

У меня была подпрограмма, которая должна выполнить 2 разных действия в зависимости от того, является ли адрес IPV4 или IPV6. Если я просто сопоставляю шаблон для ':', чтобы определить, является ли адрес IPV6?

Есть ли исключения?

Например: 1.1.1.1 не имеет двоеточия 1::1 имеет:

Также будет работать вышеуказанное для подсетей: например: 1.2.3.4/24 2002::1.2.3.4/120

Я не хочу использовать огромное соответствие шаблону регулярного выражения ни для IPV4, ни для IPV6. Спасибо.


person user2577590    schedule 12.07.2013    source источник
comment
А как насчет 120.0.0.1:8000?   -  person John Dvorak    schedule 12.07.2013
comment
Сопоставление точек кажется более безопасным   -  person John Dvorak    schedule 12.07.2013
comment
@JanDvorak Если вы соответствуете URL-адресу, это будет правильно. Но не для IP-адресов.   -  person Bart    schedule 12.07.2013
comment
@JanDvorak, ::FFFF:192.168.1.1 является действительным адресом IPv6.   -  person Greg Oschwald    schedule 13.07.2013


Ответы (2)


Если вам нужно полное соответствие IPV6, то полное регулярное выражение здесь:

person vyom    schedule 12.07.2013
comment
Хотя теоретически это может ответить на вопрос, было бы предпочтительнее включить сюда основные части ответа и предоставить ссылку для справки. Вы забыли на самом деле процитировать ссылку? - person John Dvorak; 12.07.2013
comment
@Jan, используемое регулярное выражение было слишком большим, поэтому я просто добавил ссылку. Обязательно процитирую в следующий раз. - person vyom; 13.07.2013

Короче говоря, если количество двоеточий во входных данных ›=2, считайте, что это IPv6.


У меня была та же проблема, когда входными данными могут быть либо IPv4, либо IPv6, либо имя хоста и, возможно, порт в каждом случае. На основе ввода требовалось проверить его с помощью соответствующего регулярного выражения.

Подход, который я рассматривал, заключался в том, чтобы подсчитать количество двоеточий во входных данных. Если colonCount >= 2 => IPv6, в противном случае либо IPv4, либо имя хоста. Позже IPv6 был извлечен на основе наличия порта, если он существует между [ и ]:. Для v4/host просто разделите с помощью :. Оставшаяся строка представляет собой чистый IP-адрес (v4/v6) или имя хоста, которое можно оценить с помощью соответствующего регулярного выражения.

person Pavan Kumar    schedule 15.10.2020