Вы можете использовать следующие регулярные выражения отдельно или объединяя их в объединенное выражение OR.
ValidIpAddressRegex = "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$";
ValidHostnameRegex = "^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$";
ValidIpAddressRegex соответствует действительным IP-адресам и допустимым именам хостов ValidHostnameRegex . В зависимости от языка, который вы используете, \ может быть экранировано с помощью \.
ValidHostnameRegex является действительным в соответствии с RFC 1123 . Первоначально RFC 952 указывал, что сегменты имени хоста не могут начинаться с цифры.
http://en.wikipedia.org/wiki/Hostname
Исходная спецификация имен хостов в RFC 952 требовала, чтобы метки не могли начинаться с цифры или с дефиса и не должны заканчиваться дефисом. Однако последующая спецификация ( RFC 1123 ) разрешила меткам имен хостов начинаться с цифр.
Valid952HostnameRegex = "^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$";
éxämplè.com
=xn--xmpl-loa1ab.com
), а затем проверены.123.456.789.0
и он говорит, что это действительное имя хоста.В имени хоста регулярное выражение smink не ограничивает длину отдельных меток в имени хоста. Каждая метка в пределах допустимого имени хоста может быть длиной не более 63 октетов.
Обратите внимание, что обратная косая черта в конце первой строки (выше) - это синтаксис оболочки Unix для разбиения длинной строки. Это не часть самого регулярного выражения.
Вот только одно регулярное выражение в одной строке:
Вы также должны отдельно проверить, что общая длина имени хоста не должна превышать 255 символов . Для получения дополнительной информации, пожалуйста, обратитесь к RFC-952 и RFC-1123.
источник
/^[a-z\d]([a-z\d\-]{0,61}[a-z\d])?(\.[a-z\d]([a-z\d\-]{0,61}[a-z\d])?)*$/i
Чтобы сопоставить действительный IP-адрес, используйте следующее регулярное выражение:
вместо:
объяснение
Многие движки регулярных выражений соответствуют первой возможности в
OR
последовательности. Например, попробуйте следующее регулярное выражение:Тестовое задание
Проверьте разницу между хорошим и плохим
источник
([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*
против([a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]|[a-zA-Z0-9])(\.([a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])|[a-zA-Z0-9]))*
+
в конце вместо того,*
чтобы увидеть сбой.Кажется, я не могу редактировать верхний пост, поэтому я добавлю свой ответ здесь.
Для имени хоста - простой ответ, на примере egrep здесь - http: //www.linuxinsight.com/how_to_grep_for_ip_addresses_using_the_gnu_egrep_utility.html
Хотя в этом случае не учитываются такие значения, как 0 в первом октете, а также значения, превышающие 254 (IP-адрес) или 255 (маска сети). Может быть, дополнительное заявление if поможет.
Что касается допустимого имени хоста DNS, при условии, что вы проверяете только имена хостов в Интернете (а не в интрасети), я написал следующий фрагмент кода shell / php, но он должен быть применим в качестве любого регулярного выражения.
Сначала зайдите на сайт ietf, скачайте и проанализируйте список законных доменных имен уровня 1:
Это должно дать вам хороший кусок кода, который проверяет законность верхнего доменного имени, например .com .org или .ca
Затем добавьте первую часть выражения в соответствии с указаниями, приведенными здесь - http://www.domainit.com/support/faq.mhtml?category=Domain_FAQ&question=9 (любая буквенно-цифровая комбинация и символ «-» не должны быть в тире начало или конец октета.
Затем соберите все это вместе (пример PHP preg_match):
Вы также можете добавить оператор if, чтобы проверить, что проверяемая вами строка короче 256 символов - http://www.ops.ietf.org/lists/namedroppers/namedroppers.2003/msg00964.html.
источник
Стоит отметить, что есть библиотеки для большинства языков, которые делают это для вас, часто встроенные в стандартную библиотеку. И эти библиотеки, вероятно, будут обновляться гораздо чаще, чем код, который вы скопировали из ответа Stack Overflow четыре года назад и о котором забыли. И, конечно, они также обычно разбирают адрес в какую-то удобную форму, а не просто дают вам совпадение с группой групп.
Например, обнаружение и анализ IPv4 в (POSIX) C:
Очевидно, что такие функции не будут работать, если вы пытаетесь, например, найти все действительные адреса в сообщении чата, но даже там может быть проще использовать простое, но чрезмерно усердное регулярное выражение для поиска потенциальных совпадений, а затем использовать библиотека для их разбора.
Например, в Python:
источник
источник
Я думаю, что это лучшее регулярное выражение проверки IP. пожалуйста, проверьте это один раз !!!
источник
источник
Это работает для действительных IP-адресов:
источник
источник
Вот регулярное выражение, которое я использовал в Ant для получения IP-адреса прокси-сервера или имени хоста из ANT_OPTS. Это использовалось для получения IP-адреса прокси, чтобы я мог выполнить тест Ant «isreachable» перед настройкой прокси для разветвленной JVM.
источник
\w
верно, он не будет захватывать IP, только имя хоста в определенных ситуациях.Я обнаружил, что это работает очень хорошо для IP-адресов. Он проверяется как верхний ответ, но также гарантирует, что ip изолирован, поэтому текст или больше цифр / десятичных чисел не идут после или перед ip.
источник
это повторно используются только для проверки этого типа
работать только если http://www.kk.com http://www.kk.co.in
не работает для
http://www.kk.com/ http: //www.kk.co.in.kk
http://www.kk.com/dfas http://www.kk.co.in/
источник
попробуй это:
это работает в моем случае.
источник
Что касается IP-адресов, кажется, что есть некоторые споры о том, включать ли ведущие нули. Когда-то это было обычной практикой и общепринятым, поэтому я бы сказал, что они должны быть отмечены как действительные, независимо от текущих предпочтений. Существует также некоторая двусмысленность относительно того, должен ли текст до и после строки проверяться, и, опять же, я думаю, что это должно быть. 1.2.3.4 является действительным IP, но 1.2.3.4.5 - нет, и ни часть 1.2.3.4, ни часть 2.3.4.5 не должны приводить к совпадению. Некоторые из проблем могут быть обработаны с помощью этого выражения:
Неудачной частью здесь является тот факт, что часть регулярного выражения, которая проверяет октет, повторяется, как и во многих предлагаемых решениях. Хотя это лучше, чем для экземпляров шаблона, повторение можно полностью исключить, если в используемом регулярном выражении поддерживаются подпрограммы. В следующем примере эти функции
-P
включаются с помощью переключателя,grep
а также используются функции прогнозирования и прогнозирования. (Я выбрал имя функции «o» для октета. Я мог бы использовать «octet» в качестве имени, но хотел быть кратким.)Обработка точки может на самом деле создавать ложные отрицания, если IP-адреса находятся в файле с текстом в форме предложений, поскольку период может следовать, не будучи частью точечной нотации. Вариант вышеупомянутого исправит это:
источник
источник
Новая сетевая структура имеет неудачные инициализаторы для struct IPv4Address и struct IPv6Address, которые очень легко обрабатывают часть IP-адреса. Делать это в IPv6 с регулярным выражением сложно со всеми правилами сокращения.
К сожалению, у меня нет элегантного ответа на имя хоста.
Обратите внимание, что Network Framework является последней, поэтому она может заставить вас скомпилировать для последних версий ОС.
источник
как насчет этого?
источник
на php:
filter_var(gethostbyname($dns), FILTER_VALIDATE_IP) == true ? 'ip' : 'not ip'
источник
Проверка имен хостов, таких как ... mywebsite.co.in, thangaraj.name, 18thangaraj.in, thangaraj106.in и т. Д.,
источник
inet_aton
достаточно хорошЯ думал об этом простом шаблоне сопоставления регулярных выражений для сопоставления IP-адресов \ d + [.] \ D + [.] \ D + [.] \ D +
источник
^\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}
и, конечно, это не будет правильным способом. Если у вас есть язык для написания скрипта, вы наверняка получите доступ к его сетевым функциям. Лучший способ проверить РЕАЛЬНЫЙ ip - это сказать системе конвертировать и ip в правильный формат, а затем проверить на true / false. В случае с Python я используюsocket.inet_aton(ip)
. Случай PHP вам нуженinet_aton($ip)
.