Регулярное выражение, которое соответствует допустимым адресам IPv6

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

112
задан Stefan Lasiewski 2 November 2015 в 21:58
поделиться

6 ответов

Если Вы используете попытку Perl Сеть:: IPv6Addr

use Net::IPv6Addr;

if( defined Net::IPv6Addr::is_ipv6($ip_address) ){
  print "Looks like an ipv6 address\n";
}

NetAddr:: IP

use NetAddr::IP;

my $obj = NetAddr::IP->new6($ip_address);

Проверяет:: IP

use Validate::IP qw'is_ipv6';

if( is_ipv6($ip_address) ){
  print "Looks like an ipv6 address\n";
}
3
ответ дан Brad Gilbert 24 November 2019 в 02:45
поделиться

У меня был бы к решительно второму ответ от Frank Krueger .

, Пока Вы говорите, Вам нужно регулярное выражение для соответствия адресу IPv6, я принимаю то, в чем Вы действительно нуждаетесь, должен быть в состоянии проверить, является ли данная строка допустимым адресом IPv6. Здесь существует тонкое, но важное различие.

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

Пользуются существующей библиотекой, если Вы можете. Библиотека будет иметь меньше ошибок, и ее использование приведет к меньшему количеству кода для Вас для поддержания.

регулярное выражение, предложенное , Факторный Мистик длинен и сложен. Это, скорее всего, работает, но необходимо также рассмотреть, как Вы справились бы, если это неожиданно перестало работать. Мнение, которое я пытаюсь высказать здесь, - то, что, если Вы не можете сформировать необходимое регулярное выражение сами, Вы не будете в состоянии легко отладить его.

, Если у Вас нет подходящей библиотеки, может быть лучше записать Вашу собственную стандартную программу проверки IPv6, которая не зависит от регулярных выражений. Если Вы пишете его, Вы понимаете его и если Вы понимаете его, можно добавить комментарии для объяснения его так, чтобы другие могли также понять и впоследствии поддержать его.

закон с осторожностью при использовании регулярного выражения, функциональность которого Вы не можете объяснить кому-то еще.

9
ответ дан Jon Cram 24 November 2019 в 02:45
поделиться

Это кажется, что можно использовать Python. Если так, можно использовать что-то вроде этого:

import socket

def check_ipv6(n):
    try:
        socket.inet_pton(socket.AF_INET6, n)
        return True
    except socket.error:
        return False

print check_ipv6('::1') # True
print check_ipv6('foo') # False
print check_ipv6(5)     # TypeError exception
print check_ipv6(None)  # TypeError exception

я не думаю, что необходимо было скомпилировать IPv6 в к Python для получения inet_pton , который может также проанализировать адреса IPv4, если Вы передаете в socket.AF_INET как первый параметр.Примечание: это не может работать над системами не-Unix.

22
ответ дан the Tin Man 24 November 2019 в 02:45
поделиться

От" IPv6 regex":

(\A([0-9a-f]{1,4}:){1,1}(:[0-9a-f]{1,4}){1,6}\Z)|
(\A([0-9a-f]{1,4}:){1,2}(:[0-9a-f]{1,4}){1,5}\Z)|
(\A([0-9a-f]{1,4}:){1,3}(:[0-9a-f]{1,4}){1,4}\Z)|
(\A([0-9a-f]{1,4}:){1,4}(:[0-9a-f]{1,4}){1,3}\Z)|
(\A([0-9a-f]{1,4}:){1,5}(:[0-9a-f]{1,4}){1,2}\Z)|
(\A([0-9a-f]{1,4}:){1,6}(:[0-9a-f]{1,4}){1,1}\Z)|
(\A(([0-9a-f]{1,4}:){1,7}|:):\Z)|
(\A:(:[0-9a-f]{1,4}){1,7}\Z)|
(\A((([0-9a-f]{1,4}:){6})(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3})\Z)|
(\A(([0-9a-f]{1,4}:){5}[0-9a-f]{1,4}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3})\Z)|
(\A([0-9a-f]{1,4}:){5}:[0-9a-f]{1,4}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)|
(\A([0-9a-f]{1,4}:){1,1}(:[0-9a-f]{1,4}){1,4}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)|
(\A([0-9a-f]{1,4}:){1,2}(:[0-9a-f]{1,4}){1,3}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)|
(\A([0-9a-f]{1,4}:){1,3}(:[0-9a-f]{1,4}){1,2}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)|
(\A([0-9a-f]{1,4}:){1,4}(:[0-9a-f]{1,4}){1,1}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)|
(\A(([0-9a-f]{1,4}:){1,5}|:):(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)|
(\A:(:[0-9a-f]{1,4}){1,5}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)
23
ответ дан the Tin Man 24 November 2019 в 02:45
поделиться

The regex allows the use of leading zeros in the IPv4 parts.

Some Unix and Mac distros convert those segments into octals.

I suggest using 25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d as an IPv4 segment.

-2
ответ дан 24 November 2019 в 02:45
поделиться

Следующее будет проверять адреса IPv4, IPv6 (полный и сжатый) и IPv6v4 (полный и сжатый):

'/^(?>(?>([a-f0-9]{1,4})(?>:(?1)){7}|(?!(?:.*[a-f0-9](?>:|$)){8,})((?1)(?>:(?1)){0,6})?::(?2)?)|(?>(?>(?1)(?>:(?1)){5}:|(?!(?:.*[a-f0-9]:){6,})(?3)?::(?>((?1)(?>:(?1)){0,4}):)?)?(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(?>\.(?4)){3}))$/iD'
51
ответ дан 24 November 2019 в 02:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: