regex - 네임서버 무료 DNS 호스트 이름 또는 IP 주소와 일치하는 정규식?



10 Answers

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

첫 번째 줄의 끝에있는 백 슬래시 (위)는 긴 줄을 분할하기위한 유닉스 셸 구문입니다. 그것은 정규 표현식 자체의 일부가 아닙니다.

다음은 한 줄로 된 정규 표현식입니다.

^([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을 참조하십시오.

정규표현식 문자열 추출

법적인 DNS 호스트 이름이나 IP 주소와 일치하는 정규 표현식을 가진 사람이 있습니까?

95 %의 시간 동안 작동하는 서버를 작성하는 것은 쉽지만 DNS 호스트 이름에 대한 최신 RFC 사양과 정확하게 일치하는 테스트를 받기를 바라고 있습니다.




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

hostname - 쉬운 대답, 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}'

이 경우는 주먹 옥텟에서 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
    }

if 문을 추가하여 검사하는 문자열이 256 자보다 짧은 지 http://www.ops.ietf.org/lists/namedroppers/namedroppers.2003/msg00964.html




나는 이것이 최고의 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]))$



"^((\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5])\.){3}(\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5])$"



표준 라이브러리에 내장되어있는 대부분의 언어에 대한 라이브러리가 있습니다. 그리고 이러한 라이브러리는 4 년 전에 스택 오버플로 () 응답을 복사하여 잊어 버린 코드보다 훨씬 자주 업데이트 될 것입니다. 그리고 물론 그들은 일반적으로 집단의 무리들과 일치하는 것보다는 유용한 형태로 주소를 파싱합니다.

예를 들어, (POSIX) C :

#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;
}

물론, 채팅 메시지에 유효한 주소를 모두 찾으려는 경우에는 이러한 기능이 작동하지 않습니다.하지만 거기에서도 간단하지만 과장된 정규 표현식을 사용하여 잠재적 인 일치 항목을 찾는 것이 더 쉬울 수 있습니다. 라이브러리를 파싱합니다.

예를 들어, Python에서 :

>>> 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



나는 이것이 IP 주소에 꽤 잘 작동 함을 발견했다. 그것은 최상위 답변과 같은 유효성을 검사하지만 IP가 격리되어 있는지 확인하므로 텍스트 나 숫자 / 소수가 ip 이전 또는 이후에 없습니다.

(? <! \ S) (? :(? : \ d | [1-9] \ d | 1 \ d \ d | 2 [0-4] \ d | 25 [0-5]) \ b | \ b) {7} (?! \ S)




public string GetPublicIP()
    {
        var direction = string.Empty;
        var request = WebRequest.Create("http://checkip.dyndns.org/");

        using (var response = request.GetResponse())
        using (var stream = new StreamReader(response.GetResponseStream()))
        {
            direction = stream.ReadToEnd();
        }

        var matches = matchIp.Match(direction);
        return matches.Captures.Count != 0 ? matches.Captures[0].Value : string.Empty;
    }



IP 주소와 관련하여, 앞에 오는 0을 포함할지 여부에 대한 논의가 있습니다. 한 때 일반적인 관행이었으며 일반적으로 받아 들여졌 기 때문에 현재 선호도에 관계없이 유효한 것으로 표시 되어야 한다고 주장 할 것입니다. 문자열 앞뒤에있는 텍스트의 유효성을 검사해야하는지에 대한 모호성이 있으며, 다시 생각해 봐야합니다. 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:]]|$)' 

여기서 불행한 부분은 옥텟의 유효성을 검사하는 정규 표현식 부분이 많은 제안 된 솔루션 에서처럼 반복된다는 사실입니다. 이것은 패턴의 인스턴스보다 좋지만, 사용되는 정규 표현식에서 서브 루틴이 지원되면 반복을 완전히 제거 할 수 있습니다. 다음 예제는 grep-P 스위치를 사용하여 이러한 기능을 활성화하고 lookahead 및 lookbehind 기능을 활용합니다. (내가 선택한 함수 이름은 옥텟의 경우 'o'이며 이름으로 '옥텟'을 사용할 수 있지만 간결하게 사용하고 싶습니다.)

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 주소가 점으로 된 표기법의 일부가 아니므로 마침표가 올 수 있기 때문에 문장 형식의 텍스트 파일에 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-9]{1,3}\.){3}[0-9]{1,3}



호스트 이름을 확인하는 중 ... mywebsite.co.in, thangaraj.name, 18thangaraj.in, thangaraj106.in 등,

[a-z\d+].*?\\.\w{2,4}$



Related


Tags

regex   dns