[regex] DNS 호스트 이름 또는 IP 주소와 일치하는 정규식?

누구나 합법적 인 DNS 호스트 이름 또는 IP 주소와 일치하는 정규식이 있습니까?

95 %의 시간 동안 작동하는 것을 작성하는 것은 쉽지만 DNS 호스트 이름에 대한 최신 RFC 사양과 정확히 일치하도록 잘 테스트 된 것을 얻고 자합니다.



답변

다음 정규식을 개별적으로 사용하거나 공동 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 유효한 호스트 이름 과 일치합니다 . 사용하는 언어에 따라 \로 이스케이프해야 할 수도 있습니다.


ValidHostnameRegexRFC 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])$";


답변

smink 의 호스트 이름 정규식은 호스트 이름 내의 개별 레이블 길이에 대한 제한을 준수하지 않습니다. 유효한 호스트 이름 내의 각 레이블은 길이가 63 옥텟을 초과 할 수 없습니다.

ValidHostnameRegex = "^ ([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])) * $ "

첫 번째 줄 끝의 위의 백 슬래시는 긴 줄을 나누기위한 Unix 쉘 구문입니다. 정규 표현식 자체의 일부가 아닙니다.

한 줄에 정규 표현식 만 있습니다.

^ ([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])) * $

또한 호스트 이름의 총 길이가 255자를 초과하지 않아야합니다 . 자세한 내용은 RFC-952 및 RFC-1123을 참조하십시오.


답변

유효한 IP 주소 를 일치 시키려면 다음 정규식을 사용하십시오.

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

대신에:

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

설명

많은 정규식 엔진이 OR시퀀스 의 첫 번째 가능성과 일치합니다 . 예를 들어 다음 정규식을 시도하십시오.

10.48.0.200

테스트

차이 테스트 좋은나쁜


답변

최상위 게시물을 편집 할 수없는 것 같습니다. 여기에 답변을 추가하겠습니다.

호스트 이름-쉬운 대답, egrep 예제 여기에서 http : //www.linuxinsight.com/how_to_grep_for_ip_addresses_using_the_gnu_egrep_utility.html

egrep '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}'

이 경우는 8 진수 옥텟의 0과 254 (ip addres) 또는 255 (netmask)보다 큰 값을 고려하지 않습니다. 추가 if 문이 도움이 될 것입니다.

법률 dns 호스트 이름에 관해서는 (인터넷 인트라넷이 아닌) 인터넷 호스트 이름 만 검사하고 있다면 쉘 / PHP의 혼합을 다음과 같이 썼지 만 정규 표현식으로 적용 할 수 있습니다.

먼저 ietf 웹 사이트로 이동하여 법적 레벨 1 도메인 이름 목록을 다운로드하고 구문 분석하십시오.

tld=$(curl -s http://data.iana.org/TLD/tlds-alpha-by-domain.txt |  sed 1d  | cut -f1 -d'-' | tr '\n' '|' | sed 's/\(.*\)./\1/')
echo "($tld)"

.com .org 또는 .ca와 같이 최상위 도메인 이름의 적법성을 검사하는 멋진 코드가 제공됩니다.

그런 다음 여기에 나와있는 지침에 따라 표현식의 첫 부분을 추가하십시오 .http : //www.domainit.com/support/faq.mhtml?category=Domain_FAQ&question=9 옥텟의 시작 또는 끝.

(([a-z0-9]+|([a-z0-9]+[-]+[a-z0-9]+))[.])+

그런 다음이를 모두 정리하십시오 (PHP preg_match 예).

$pattern = '/^(([a-z0-9]+|([a-z0-9]+[-]+[a-z0-9]+))[.])+(AC|AD|AE|AERO|AF|AG|AI|AL|AM|AN|AO|AQ|AR|ARPA|AS|ASIA|AT|AU|AW|AX|AZ|BA|BB|BD|BE|BF|BG|BH|BI|BIZ|BJ|BM|BN|BO|BR|BS|BT|BV|BW|BY|BZ|CA|CAT|CC|CD|CF|CG|CH|CI|CK|CL|CM|CN|CO|COM|COOP|CR|CU|CV|CX|CY|CZ|DE|DJ|DK|DM|DO|DZ|EC|EDU|EE|EG|ER|ES|ET|EU|FI|FJ|FK|FM|FO|FR|GA|GB|GD|GE|GF|GG|GH|GI|GL|GM|GN|GOV|GP|GQ|GR|GS|GT|GU|GW|GY|HK|HM|HN|HR|HT|HU|ID|IE|IL|IM|IN|INFO|INT|IO|IQ|IR|IS|IT|JE|JM|JO|JOBS|JP|KE|KG|KH|KI|KM|KN|KP|KR|KW|KY|KZ|LA|LB|LC|LI|LK|LR|LS|LT|LU|LV|LY|MA|MC|MD|ME|MG|MH|MIL|MK|ML|MM|MN|MO|MOBI|MP|MQ|MR|MS|MT|MU|MUSEUM|MV|MW|MX|MY|MZ|NA|NAME|NC|NE|NET|NF|NG|NI|NL|NO|NP|NR|NU|NZ|OM|ORG|PA|PE|PF|PG|PH|PK|PL|PM|PN|PR|PRO|PS|PT|PW|PY|QA|RE|RO|RS|RU|RW|SA|SB|SC|SD|SE|SG|SH|SI|SJ|SK|SL|SM|SN|SO|SR|ST|SU|SV|SY|SZ|TC|TD|TEL|TF|TG|TH|TJ|TK|TL|TM|TN|TO|TP|TR|TRAVEL|TT|TV|TW|TZ|UA|UG|UK|US|UY|UZ|VA|VC|VE|VG|VI|VN|VU|WF|WS|XN|XN|XN|XN|XN|XN|XN|XN|XN|XN|XN|YE|YT|YU|ZA|ZM|ZW)[.]?$/i';

    if (preg_match, $pattern, $matching_string){
    ... do stuff
    }

확인하는 문자열이 256 자보다 짧은 지 확인하기 위해 if 문을 추가 할 수도 있습니다 ( http://www.ops.ietf.org/lists/namedroppers/namedroppers.2003/msg00964.html


답변

표준 라이브러리에 내장되어있는 대부분의 언어를위한 라이브러리가 있습니다. 그리고 그 라이브러리는 4 년 전에 스택 오버플로 답변을 복사하고 잊어 버린 코드보다 훨씬 자주 업데이트 될 가능성이 큽니다. 물론 그들은 일반적으로 여러 그룹과 일치하는 대신 주소를 사용 가능한 형태로 구문 분석합니다.

예를 들어 (POSIX) C에서 IPv4 감지 및 구문 분석 :

#include <arpa/inet.h>
#include <stdio.h>

int main(int argc, char *argv[]) {
  for (int i=1; i!=argc; ++i) {
    struct in_addr addr = {0};
    printf("%s: ", argv[i]);
    if (inet_pton(AF_INET, argv[i], &addr) != 1)
      printf("invalid\n");
    else
      printf("%u\n", addr.s_addr);
  }
  return 0;
}

예를 들어, 채팅 메시지에서 유효한 모든 주소를 찾으려고하면 이러한 기능이 작동하지 않습니다. 그러나 거기에서도 단순하지만 지나치게 정식적인 정규식을 사용하여 잠재적 인 일치 항목을 찾는 것이 더 쉬울 수 있습니다. 라이브러리를 구문 분석합니다.

예를 들어, 파이썬에서 :

>>> import ipaddress
>>> import re
>>> msg = "My address is 192.168.0.42; 192.168.0.420 is not an address"
>>> for maybeip in re.findall(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', msg):
...     try:
...         print(ipaddress.ip_address(maybeip))
...     except ValueError:
...         pass


답변

def isValidHostname(hostname):

    if len(hostname) > 255:
        return False
    if hostname[-1:] == ".":
        hostname = hostname[:-1]   # strip exactly one dot from the right,
                                   #  if present
    allowed = re.compile("(?!-)[A-Z\d-]{1,63}(?<!-)$", re.IGNORECASE)
    return all(allowed.match(x) for x in hostname.split("."))


답변

나는 이것이 최고의 IP 검증 정규식이라고 생각합니다. 한번 확인 해주세요 !!!

^(([01]?[0-9]?[0-9]|2([0-4][0-9]|5[0-5]))\.){3}([01]?[0-9]?[0-9]|2([0-4][0-9]|5[0-5]))$