누구나 합법적 인 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 유효한 호스트 이름 과 일치합니다 . 사용하는 언어에 따라 \로 이스케이프해야 할 수도 있습니다.
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])$";
답변
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]))$