답변:
다음 정규식을 개별적으로 사용하거나 공동 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 옥텟을 초과 할 수 없습니다.
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을 참조하십시오.
/^[a-z\d]([a-z\d\-]{0,61}[a-z\d])?(\.[a-z\d]([a-z\d\-]{0,61}[a-z\d])?)*$/i
유효한 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
([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
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 주소에 이것이 잘 작동한다는 것을 알았습니다. 그것은 최고 답변처럼 유효성을 검사하지만 ip가 격리되어 IP 뒤에 또는 앞에 텍스트 또는 더 많은 숫자 / 십진수가 없도록합니다.
(? <! \ S) (? : (? : \ d | [1-9] \ d | 1 \ d \ d | 2 [0-4] \ d | 25 [0-5]) \ b |. \ b) {7} (?! \ S)
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 인 경우에만 작동
작동하지 않습니다
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:]]|$)'
불행한 부분은 옥텟을 검증하는 정규 표현식 부분이 많은 솔루션에서 사실대로 반복된다는 사실입니다. 이것이 패턴의 인스턴스보다 낫지 만 서브 루틴이 사용되는 정규식에서 지원되는 경우 반복을 완전히 제거 할 수 있습니다. 다음 예는 -P
스위치 를 사용하여 해당 기능을 활성화하고 grep
미리보기 및 미리보기 기능을 활용합니다. (선택한 기능 이름은 옥텟의 경우 '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 주소가 문장 형식의 텍스트가있는 파일에있는 경우 점을 처리하면 실제로 잘못된 부정이 발생할 수 있습니다. 위의 변형은 다음을 수정합니다.
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))'
>>> 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
새로운 네트워크 프레임 워크에는 IP 주소 부분을 매우 쉽게 처리하는 struct IPv4Address 및 struct IPv6Address에 대한 실패한 초기화 프로그램이 있습니다. 정규식을 사용하여 IPv6에서이 작업을 수행하는 것은 모든 단축 규칙에 따라 어렵습니다.
불행히도 호스트 이름에 대한 우아한 대답이 없습니다.
네트워크 프레임 워크는 최신 버전이므로 최신 OS 버전으로 컴파일해야 할 수도 있습니다.
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"
PHP에서 : filter_var(gethostbyname($dns), FILTER_VALIDATE_IP) == true ? 'ip' : 'not ip'
mywebsite.co.in, thangaraj.name, 18thangaraj.in, thangaraj106.in 등과 같은 호스트 이름 확인
[a-z\d+].*?\\.\w{2,4}$
inet_aton
충분합니다.
IP 주소 일치 \ d + [.] \ d + [.] \ d + [.] \ d +에 대한이 간단한 정규식 일치 패턴에 대해 생각했습니다.
^\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}
올바른 방법이 아닌 비슷한 모양으로 외모 수에주의를 기울여야합니다 . 스크립트를 작성할 언어가있는 경우 네트워크 기능에 액세스 할 수 있습니다. REAL ip를 확인하는 가장 좋은 방법은 시스템에 올바른 형식으로 변환하고 ip하도록 지시 한 다음 true / false를 확인하는 것입니다. 파이썬의 경우을 사용 socket.inet_aton(ip)
합니다. PHP의 경우 필요합니다 inet_aton($ip)
.