Регулярное выражение для соответствия имени хоста DNS или IP-адресу? - PullRequest
352 голосов
/ 20 сентября 2008

Есть ли у кого-нибудь удобное регулярное выражение, которое будет соответствовать любому допустимому имени хоста DNS или IP-адресу?

Легко написать тот, который работает в 95% случаев, но я надеюсь получить что-то, что хорошо протестировано, чтобы точно соответствовать последним спецификациям RFC для имен хостов DNS.

Ответы [ 21 ]

0 голосов
/ 12 апреля 2016
>>> my_hostname = "testhostn.ame"
>>> print bool(re.match("^(([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])$", my_hostname))
True
>>> my_hostname = "testhostn....ame"
>>> print bool(re.match("^(([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])$", my_hostname))
False
>>> my_hostname = "testhostn.A.ame"
>>> print bool(re.match("^(([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])$", my_hostname))
True
0 голосов
/ 11 января 2016

на php: filter_var(gethostbyname($dns), FILTER_VALIDATE_IP) == true ? 'ip' : 'not ip'

0 голосов
/ 10 ноября 2015

Я думал об этом простом шаблоне сопоставления регулярных выражений для сопоставления IP-адресов \ D + [.] \ D + [.] \ D + [.] \ Д +

0 голосов
/ 24 июля 2015

Что касается IP-адресов, похоже, что есть некоторые споры о том, включать ли ведущие нули. Когда-то это было обычной практикой и общепринятым, поэтому я бы сказал, что они должны помечаться как действительные независимо от текущего предпочтения. Существует также некоторая двусмысленность в отношении того, должен ли текст до и после строки проверяться, и, опять же, я думаю, что так и должно быть. 1.2.3.4 является действительным IP, но 1.2.3.4.5 - нет, и ни часть 1.2.3.4, ни часть 2.3.4.5 не должны приводить к совпадению. Некоторые из проблем могут быть решены с помощью этого выражения:

grep -E '(^|[^[:alnum:]+)(([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.){3}([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])([^[:alnum:]]|$)' 

Прискорбной частью здесь является тот факт, что часть регулярного выражения, которая проверяет октет, повторяется, как и во многих предлагаемых решениях. Хотя это лучше, чем для экземпляров шаблона, повторение можно полностью исключить, если в используемом регулярном выражении поддерживаются подпрограммы. В следующем примере эти функции включаются с помощью переключателя -P, равного grep, а также используют преимущества функций просмотра вперед и назад. (Я выбрал имя функции «o» для октета. Я мог бы использовать «octet» в качестве имени, но хотел быть кратким.)

grep -P '(?<![\d\w\.])(?<o>([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5]))(\.\g<o>){3}(?![\d\w\.])'

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

grep -P '(?<![\d\w\.])(?<x>([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5]))(\.\g<x>){3}(?!([\d\w]|\.\d))'
0 голосов
/ 27 мая 2015

попробуйте это:

((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)

это работает в моем случае.

0 голосов
/ 25 июня 2014
AddressRegex = "^(ftp|http|https):\/\/([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}:[0-9]{1,5})$";

HostnameRegex =  /^(ftp|http|https):\/\/([a-z0-9]+\.)?[a-z0-9][a-z0-9-]*((\.[a-z]{2,6})|(\.[a-z]{2,6})(\.[a-z]{2,6}))$/i

это используется только для проверки этого типа

работает только если 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/

0 голосов
/ 19 февраля 2010

Вот регулярное выражение, которое я использовал в Ant для получения IP-адреса прокси-хоста или имени хоста из ANT_OPTS. Это использовалось для получения IP-адреса прокси, чтобы я мог выполнить тест Ant «isreachable» перед настройкой прокси для разветвленной JVM.

^.*-Dhttp\.proxyHost=(\w{1,}\.\w{1,}\.\w{1,}\.*\w{0,})\s.*$
0 голосов
/ 11 января 2012

Проверка имен хостов, например ... mywebsite.co.in, thangaraj.name, 18thangaraj.in, thangaraj106.in и т. Д.,

[a-z\d+].*?\\.\w{2,4}$
0 голосов
/ 08 апреля 2013

как насчет этого?

([0-9]{1,3}\.){3}[0-9]{1,3}
0 голосов
/ 02 марта 2019

Новая сетевая структура имеет неудачные инициализаторы для struct IPv4Address и struct IPv6Address, которые очень легко обрабатывают часть IP-адреса. Делать это в IPv6 с регулярным выражением сложно со всеми правилами сокращения.

К сожалению, у меня нет элегантного ответа на имя хоста.

Обратите внимание, что Network Framework является последней, поэтому она может заставить вас скомпилировать для последних версий ОС.

import Network
let tests = ["192.168.4.4","fkjhwojfw","192.168.4.4.4","2620:3","2620::33"]

for test in tests {
    if let _ = IPv4Address(test) {
        debugPrint("\(test) is valid ipv4 address")
    } else if let _ = IPv6Address(test) {
        debugPrint("\(test) is valid ipv6 address")
    } else {
        debugPrint("\(test) is not a valid IP address")
    }
}

output:
"192.168.4.4 is valid ipv4 address"
"fkjhwojfw is not a valid IP address"
"192.168.4.4.4 is not a valid IP address"
"2620:3 is not a valid IP address"
"2620::33 is valid ipv6 address"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...