У меня проблемы с написанием регулярного выражения, которое соответствует действительным IPv6-адресам, в том числе в их сжатой форме (с ::
опущенными в каждой паре байтов ведущими нулями).
Может ли кто-нибудь предложить регулярное выражение, которое удовлетворяет требованию?
Я рассматриваю возможность расширения каждой пары байтов и сопоставления результата с более простым регулярным выражением.
regex
networking
ipv6
Только чтение
источник
источник
Ответы:
Мне не удалось получить ответ @Factor Mystic для работы с регулярными выражениями POSIX, поэтому я написал тот, который работает с регулярными выражениями POSIX и регулярными выражениями PERL.
Он должен соответствовать:
Регулярное выражение IPv6:
Для удобства чтения следующее регулярное выражение разделено по основным точкам ИЛИ на отдельные строки:
Чтобы упростить понимание вышеизложенного, следующий «псевдокод» повторяет приведенное выше:
Я разместил на GitHub скрипт, который проверяет регулярное выражение: https://gist.github.com/syzdek/6086792
источник
127.000.000.001
fe80
там должно быть что-то вроде[fF][eE]80
иffff
что должно быть что-то вроде[fF]{4}
Следующее будет проверять адреса IPv4, IPv6 (полные и сжатые) и IPv6v4 (полные и сжатые):
источник
Похоже, вы используете Python. Если это так, вы можете использовать что-то вроде этого:
Я не думаю, что вам нужно иметь IPv6, скомпилированный в Python, чтобы получить
inet_pton
, который также может анализировать адреса IPv4, если вы передадите его вsocket.AF_INET
качестве первого параметра. Примечание: это может не работать в системах, отличных от Unix.источник
except
. Иначеexcept
все поймают и могут замаскировать не связанные ошибки. Тип здесь должен бытьsocket.error
.Из " регулярного выражения IPv6 ":
источник
Я должен был бы полностью поддержать ответ Фрэнка Крюгера .
Хотя вы говорите, что вам нужно регулярное выражение для соответствия IPv6-адресу, я предполагаю, что вам действительно нужно иметь возможность проверить, является ли данная строка действительным IPv6-адресом. Здесь есть тонкое, но важное различие.
Существует несколько способов проверить, является ли данная строка допустимым адресом IPv6, и сопоставление регулярных выражений - только одно из решений.
По возможности используйте существующую библиотеку. В библиотеке будет меньше ошибок, и ее использование приведет к меньшему количеству кода, который вам придется поддерживать.
Регулярное выражение, предложенное Factor Mystic , длинное и сложное. Скорее всего, это сработает, но вам также следует подумать, как вы справитесь, если он неожиданно выйдет из строя. Я пытаюсь подчеркнуть, что если вы не можете самостоятельно сформировать требуемое регулярное выражение, вы не сможете легко отладить его.
Если у вас нет подходящей библиотеки, возможно, лучше написать собственную процедуру проверки IPv6, которая не зависит от регулярных выражений. Если вы пишете это, вы понимаете это, и если вы понимаете это, вы можете добавлять комментарии, чтобы объяснить это, чтобы другие могли также понять и впоследствии поддерживать его.
Будьте осторожны при использовании регулярных выражений, функции которых вы не можете объяснить кому-либо.
источник
return ex1.match(S) && ! ex2.match(S)
).Я не эксперт по IPv6, но думаю, что вы можете легко получить довольно хороший результат с этим:
чтобы ответить "это действительный ipv6", мне кажется, что это нормально. Чтобы разбить это на части ... забудьте об этом. Я пропустил неуказанный (: :), так как в моей базе данных нет смысла иметь «неуказанный адрес».
начало:
^([0-9A-Fa-f]{0,4}:){2,7}
<- соответствует сжимаемой части, мы можем перевести это как: от 2 до 7 двоеточие, между которыми может быть шестнадцатеричное число.за которым следует:
[0-9A-Fa-f]{1,4}$
<- шестнадцатеричное число (ведущий 0 опущен) ИЛИ((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}
<- адрес IPv4источник
start() = 0, end() = 3 group(0) = "::1" group(1) = ":" group(2) = "1" group(3) = "null" group(4) = "null" group(5) = "null"
Это также улавливает loopback (:: 1) и адреса ipv6. изменил {} на + и поместил: внутри первой квадратной скобки.
протестировано с помощью ifconfig -a output http://regexr.com/
Параметр o терминала Unix или Mac OSx возвращает только соответствующий вывод (ipv6), включая :: 1
Получить все IP-адреса (IPv4 ИЛИ IPv6) и распечатать совпадение по термину unix OSx
источник
ip a | grep -Po '[\w:]+:+[\w:]+'
Это регулярное выражение будет соответствовать действительным адресам IPv6 и IPv4 в соответствии с реализацией регулярного выражения GNU C ++ с использованием режима REGULAR EXTENDED:
источник
Осторожно! В Java использование InetAddress и связанных классов (Inet4Address, Inet6Address, URL) может включать сетевой трафик! Например, разрешение DNS (URL.equals, InetAddress из строки!). Этот звонок может занять много времени и блокируется!
Для IPv6 у меня примерно так. Это, конечно, не обрабатывает очень тонкие детали IPv6, например, что индексы зон разрешены только для некоторых классов адресов IPv6. И это регулярное выражение не написано для группового захвата, это просто регулярное выражение "совпадения".
S
- Сегмент IPv6 =[0-9a-f]{1,4}
I
- IPv4 =(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9]{1,2})\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9]{1,2})
Схема (первая часть соответствует адресам IPv6 с суффиксом IPv4, вторая часть соответствует адресам IPv6, последняя часть соответствует индексу зоны):
И здесь может быть регулярное выражение (без учета регистра, окружение тем, что когда-либо было необходимо, например, начало / конец строки и т. Д.):
источник
Следующее регулярное выражение предназначено только для IPv6. Группа 1 совпадает с IP.
источник
Простое регулярное выражение, которое будет соответствовать, но я бы не рекомендовал для какой-либо проверки, это следующее:
Обратите внимание, что это соответствует сжатию в любом месте адреса, но не соответствует адресу обратной связи :: 1. Я считаю это разумным компромиссом для упрощения регулярного выражения.
Я успешно использую это в правилах интеллектуального выбора iTerm2 для четырех щелчков по IPv6-адресам.
источник
A-F
, нетA-Z
! Также обратите внимание, что вы исключаете запись с разделением на четыре точки.Если вы используете Perl, попробуйте Net :: IPv6Addr
NetAddr :: IP
Проверить :: IP
источник
В Scala используются хорошо известные валидаторы Apache Commons.
http://mvnrepository.com/artifact/commons-validator/commons-validator/1.4.1
После проверки метода
ip(ip: String)
:источник
1200:0000:AB00:1234:0000:2552:7777:1313
это допустимый формат для IPv6-адреса, но он не является действительным IPv6-адресом, как возвращает тестовый метод. Готов поспорить, он думает, что241.54.113.65
это действительный адрес IPv4.Глядя на шаблоны, включенные в другие ответы, можно выделить ряд хороших шаблонов, которые можно улучшить, ссылаясь на группы и используя опережающие просмотры. Вот пример шаблона, который ссылается на себя, который я бы использовал в PHP, если бы мне пришлось:
Примечание: PHP имеет встроенный фильтр для этого, что было бы лучшим решением, чем этот шаблон.
Regex101 Анализ
источник
Я сгенерировал следующее, используя python и работаю с модулем re. Утверждения упреждающего просмотра обеспечивают правильное количество точек или двоеточий в адресе. Он не поддерживает IPv4 в нотации IPv6.
источник
Регулярные выражения для ipv6 могут быть очень сложными, если учесть адреса со встроенным ipv4 и сжатые адреса, как вы можете видеть из некоторых из этих ответов.
Библиотека IPAddress Java с открытым исходным кодом будет проверять все стандартные представления IPv6 и IPv4, а также поддерживает длину префикса (и ее проверку). Отказ от ответственности: я являюсь руководителем проекта этой библиотеки.
Пример кода:
источник
В Java вы можете использовать класс библиотеки
sun.net.util.IPAddressUtil
:источник
Трудно найти регулярное выражение, которое работало бы для всех случаев IPv6. Обычно их сложно поддерживать, их нелегко читать и они могут вызвать проблемы с производительностью. Следовательно, я хочу поделиться альтернативным решением, которое я разработал: Регулярное выражение (RegEx) для IPv6 Отдельно от IPv4
Теперь вы можете спросить: «Этот метод находит только IPv6, как я могу найти IPv6 в тексте или файле?» Вот способы решения этой проблемы.
Примечание . Если вы не хотите использовать класс IPAddress в .NET, вы также можете заменить его моим методом . Он также охватывает сопоставленный IPv4 и особые случаи, в то время как IPAddress не распространяется.
источник
InetAddressUtils
все шаблоны определены. В итоге я использовал их шаблон напрямую и вставляю его сюда для справки:источник
Используете Ruby? Попробуй это:
источник
В зависимости от ваших потребностей приблизительное значение, например:
может быть достаточно (например, с помощью простого поиска в файле журнала).
источник
Для пользователей PHP 5.2+
filter_var
отлично работает.Я знаю, что это не отвечает на исходный вопрос (в частности, решение с регулярным выражением), но я публикую его в надежде, что это может помочь кому-то другому в будущем.
источник
Это будет работать для IPv4 и IPv6:
источник
::
. например2404:6800::4003:c02::8a
Вот что я придумал, используя немного предвидения и именованные группы. Это, конечно, просто IPv6, но он не должен мешать дополнительным шаблонам, если вы хотите добавить IPv4:
источник
Вы можете использовать инструменты оболочки ipextract, которые я сделал для этой цели. Они основаны на regexp и grep.
Использование:
источник
Просто сопоставление локальных из источника с включенными квадратными скобками. Я знаю, что это не так полно, но в javascript другим было трудно отследить проблемы, в первую очередь неработающие, так что, похоже, это дает мне то, что мне нужно сейчас. лишние заглавные буквы AF тоже не нужны.
Версия Джиннко упрощена и я вижу лучше.
источник
Как уже говорилось выше, еще один способ , чтобы получить текстовое представление IPv6 проверки парсер использовать программирование. Вот тот, который полностью соответствует RFC-4291 и RFC-5952. Я написал этот код на ANSI C (работает с GCC, прошел тесты на Linux - работает с clang, прошел тесты на FreeBSD). Таким образом, он полагается только на стандартную библиотеку ANSI C, поэтому его можно компилировать везде (я использовал его для синтаксического анализа IPv6 внутри модуля ядра с FreeBSD).
источник
Попробуйте этот небольшой однострочник. Он должен соответствовать только действительным несжатым / сжатым адресам IPv6 (без гибридов IPv4)
источник
Регулярное выражение позволяет использовать ведущие нули в частях IPv4.
Некоторые дистрибутивы Unix и Mac преобразуют эти сегменты в восьмеричные числа.
Предлагаю использовать
25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d
как сегмент IPv4.источник
Если вам нужны только обычные IP-адреса (без косой черты), вот:
Я использую его для подсветки синтаксиса в приложении для редактирования файлов hosts. Работает как оберег.
источник