Frage

Hat jemand einen regulären Ausdruck praktisch, dass jede juristische DNS Hostnamen oder die IP-Adresse übereinstimmen?

Es ist einfach, einen zu schreiben, die 95% der Zeit funktioniert, aber ich bin der Hoffnung, etwas zu bekommen, die genau gut getestet ist, um die neuesten RFC-Spezifikationen für DNS-Hostnamen zu entsprechen.

War es hilfreich?

Lösung

Sie können die folgende reguläre Ausdrücke separat verwenden oder indem sie in einem gemeinsamen OR Ausdruck kombiniert werden.

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 passt gültige IP-Adressen und ValidHostnameRegex gültigen Host-Namen. In Abhängigkeit von der verwendeten Sprache \ könnte mit \ maskiert werden.


ValidHostnameRegex ist gültig ab RFC 1123 . Ursprünglich RFC 952 , die Hostnamen Segmente angegeben nicht mit einer Ziffer beginnen könnte.

http://en.wikipedia.org/wiki/Hostname

  

Die ursprüngliche Spezifikation von   Host-Namen in RFC   952 ,   den Auftrag, dass Etiketten nicht aufgerufen werden konnte   mit einer Ziffer oder mit einem Bindestrich, und   darf nicht mit einem Bindestrich enden. Doch ein   nachfolgende Spezifikation (RFC   1123 )   zulässige Hostnamen Etikett zu starten   mit Ziffern.

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

Andere Tipps

Der Hostname regex von smink beachten nicht die Begrenzung der Länge der einzelnen Etiketten in einem Hostnamen. Jedes Etikett innerhalb eines gültigen Hostnamen kann lange nicht mehr als 63 Bytes sein.

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

, dass der umgekehrte Schrägstrich am Ende der ersten Leitung (oben) ist Unix-Shell-Syntax für die lange Linie zu splitten. Es ist nicht Teil des regulären Ausdrucks selbst.

Hier ist nur der reguläre Ausdruck allein auf einer einzigen Zeile:

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

Sie sollten auch separat prüfen, ob die Gesamtlänge des Hostnamen nicht mehr als 255 Zeichen nicht überschreiten . Weitere Informationen finden Sie in RFC-952 und RFC-1123 konsultieren.

Um eine gültige entsprechen IP-Adresse verwenden Sie die folgende regex:

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

statt:

([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}

Erklärung

Viele Regex-Engine in der OR Sequenz, die die erste Möglichkeit entsprechen. Zum Beispiel, versuchen Sie die folgende regex:

10.48.0.200

Test

Testen Sie den Unterschied zwischen rel="noreferrer"> bad

Ich scheine nicht in der Lage sein, die Top-Post zu bearbeiten, so dass ich meine Antwort hinzufügen hier.

Für die Hostnamen - einfache Antwort auf egrep Beispiel hier - http: //www.linuxinsight.com/how_to_grep_for_ip_addresses_using_the_gnu_egrep_utility.html

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

Auch wenn der Fall nicht für Werte nicht erklären wie 0 in der Faust Oktett, und Werte größer als 254 (ip addres) oder 255 (netmask). Vielleicht wäre eine zusätzliche if-Anweisung helfen.

Wie für Recht DNS-Hostnamen, vorausgesetzt, dass Sie nur für die Internet-Host-Namen überprüft (und nicht Intranet), schrieb ich die snipped folgende, eine Mischung aus Shell / php aber es sollte wie jeder regulären Ausdruck anwendbar sein.

gehen Sie zuerst auf ietf Website herunterladen und eine Liste der rechtlichen Ebene 1 Domain-Namen analysieren:

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

Das sollte Ihnen ein schönes Stück Re-Code, der für die Rechtmäßigkeit der Top-Domain-Namen überprüft, wie .com .org oder .CA

Dann ersten Teil des Ausdrucks hinzufügen, hier nach den Richtlinien - http: //www.domainit.com/support/faq.mhtml?category=Domain_FAQ&question=9 (beliebige alphanumerische Kombination und ‚-‘ Symbol, Bindestrich sollte sein am Anfang oder Ende eines Oktetts nicht.

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

Dann wird alles zusammen (PHP preg_match Beispiel):

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

Sie können auch ein hinzufügen if-Anweisung die Zeichenfolge zu überprüfen, die Sie überprüft die kürzer als 256 Zeichen ist - http://www.ops.ietf.org/lists/namedroppers/namedroppers.2003/msg00964.html

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("."))

Es ist erwähnenswert, dass es Bibliotheken sind für die meisten Sprachen, die dies für Sie tun, oft in der Standard-Bibliothek gebaut. Und diese Bibliotheken sind wahrscheinlich viel häufiger als Code aktualisiert werden, dass Sie eine Stack-Überlauf Antwort vor vier Jahren kopiert weg und vergessen. Und natürlich werden sie auch die Adresse in eine nutzbare Form im Allgemeinen analysieren, anstatt Ihnen mit einem Bündel von Gruppen ein Spiel nur zu geben.

Beispiel: Erfassen und Analysieren von IPv4 in (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;
}

Natürlich werden solche Funktionen nicht funktionieren, wenn Sie versuchen, sind, zum Beispiel, finden Sie alle gültigen Adressen in einer Chat-Nachricht, aber auch dort kann es einfacher sein, einen einfachen, aber übereifrigen regex verwendet mögliche Übereinstimmungen zu finden, und dann die Bibliothek verwenden, um sie zu analysieren.

Zum Beispiel in 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

Ich denke, dies ist die beste Ip Validierung regex. Bitte überprüfen Sie es einmal !!!

^(([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]))$
/^(?:[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])?$/

localhost же есть

"^((\\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])$"

Dies funktioniert für gültige IP-Adressen:

regex = '^([0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-5][0-5])[.]([0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-5][0-5])[.]([0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-5][0-5])[.]([0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-5][0-5])$'

Dies ist ein regulärer Ausdruck, die ich in Ant verwendet, um einen Proxy-Host-IP oder den Hostnamen zu erhalten aus ANT_OPTS. Dies wurde verwendet, um das Proxy-IP zu erhalten, so dass ich eine Ameise „isreachable“ Test ausführen konnte, bevor ein Proxy für eine gespaltene JVM konfiguriert.

^.*-Dhttp\.proxyHost=(\w{1,}\.\w{1,}\.\w{1,}\.*\w{0,})\s.*$

Ich fand das ziemlich gut für IP-Adressen funktioniert. Es bestätigt, wie die Top-Antwort, aber es macht auch sicher, dass die IP-isoliert ist, so dass kein Text oder mehr Zahlen / Dezimalstellen nach oder vor der ip sind.

  
    
      ?

(?! <\ 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

sind diese wiederverwendet werden nur für diese Art Validierung

Arbeit nur, wenn http://www.kk.com http://www.kk.co.in

nicht funktioniert für

http://www.kk.com/ http: //www.kk.co.in.kk

http://www.kk.com/dfas http://www.kk.co.in/

versuchen Sie dies:

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

es funktioniert in meinem Fall.

IP-Adressen betrifft, so scheint es, dass es eine Debatte darüber, ob führende Nullen enthalten. Es war einst die gängige Praxis und allgemein akzeptiert wird, so würde ich argumentieren, dass sie sollte als unabhängig von der aktuellen Präferenz gültig gekennzeichnet werden. Es gibt auch einige Unklarheiten darüber, ob Text vor und nach der Zeichenfolge validiert und soll, wieder, ich denke, es sollte. 1.2.3.4 ist eine gültige IP aber 1.2.3.4.5 ist nicht, und weder der 1.2.3.4 Abschnitt noch der 2.3.4.5 Teil sollte in einem Spiel zur Folge hat. Einige der Bedenken können mit diesem Ausdruck behandelt werden:

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:]]|$)' 

Der unglückliche Teil ist hier die Tatsache, dass der Regex Abschnitt, der ein Oktett validiert wiederholt wird, wie in vielen angebotenen Lösungen wahr ist. Das ist zwar besser als für Instanzen des Musters kann die Wiederholung völlig beseitigt werden, wenn Subroutinen in der regex verwendet werden unterstützt. Das nächste Beispiel ermöglicht diese Funktionen mit dem -P Schalter von grep und nutzt auch Lookahead und Lookbehind-Funktionalität. (Der Name der Funktion I ausgewählt ist ‚o‘ für Oktett. Ich hätte verwenden können ‚Oktett‘, wie der Name, aber wollte terse sein.)

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

Die Handhabung des Punktes könnte tatsächlich schaffen eine falsch-negative Ergebnisse, wenn IP-Adressen in einer Datei mit Text in Form von Sätzen sind, da die eine Periode ohne folgen könnte es ein Teil der Punktnotation zu sein. Eine Variante der oben würde beheben, dass:

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

Die neue Netzwerk-Framework hat failable initializers für struct IPv4Address und struct IPv6-Adresse, die den IP-Adresse Teil sehr leicht handhaben. Dadurch in IPv6 mit einem regex ist hart mit alle Verkürzung Regeln.

Leider ich keine elegante Lösung für Host-Namen haben.

Beachten Sie, dass Netzwerk-Framework neu ist, so kann es Sie zwingen, für den letzten OS-Versionen zu erstellen.

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"

Wie wäre das?

([0-9]{1,3}\.){3}[0-9]{1,3}

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

für Host-Namen überprüft, wie ... mywebsite.co.in, thangaraj.name, 18thangaraj.in, thangaraj106.in etc.

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

Ich dachte an diesem einfachen Muster Regex Matching für IP-Adressabgleich \ D + [.] \ D + [.] \ D + [.] \ D +

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top