Ich habe Probleme beim Schreiben eines regulären Ausdrucks, der mit gültigen IPv6-Adressen übereinstimmt, einschließlich solcher in ihrer komprimierten Form (wobei in ::
jedem Bytepaar Nullen oder führende Nullen weggelassen werden).
Kann jemand einen regulären Ausdruck vorschlagen, der die Anforderung erfüllt?
Ich denke darüber nach, jedes Bytepaar zu erweitern und das Ergebnis mit einem einfacheren regulären Ausdruck abzugleichen.
regex
networking
ipv6
Schreibgeschützt
quelle
quelle
Antworten:
Ich konnte die Antwort von @Factor Mystic nicht für die Arbeit mit regulären POSIX-Ausdrücken erhalten, daher habe ich eine geschrieben, die mit regulären POSIX-Ausdrücken und regulären PERL-Ausdrücken funktioniert.
Es sollte passen:
Regulärer IPv6-Ausdruck:
Zur Vereinfachung des Lesens ist der folgende reguläre Ausdruck an wichtigen ODER-Punkten in separate Zeilen unterteilt:
Um das Obige leichter verständlich zu machen, repliziert der folgende "Pseudo" -Code das Obige:
Ich habe ein Skript auf GitHub veröffentlicht, das den regulären Ausdruck testet: https://gist.github.com/syzdek/6086792
quelle
127.000.000.001
fe80
wo es so etwas sein sollte[fF][eE]80
undffff
was so etwas sein sollte[fF]{4}
Im Folgenden werden die Adressen IPv4, IPv6 (vollständig und komprimiert) und IPv6v4 (vollständig und komprimiert) überprüft:
quelle
Es hört sich so an, als würden Sie Python verwenden. Wenn ja, können Sie so etwas verwenden:
Ich glaube nicht, dass Sie IPv6 in Python kompilieren müssen, um es zu erhalten
inet_pton
, das auch IPv4-Adressen analysieren kann, wenn Siesocket.AF_INET
als ersten Parameter übergeben. Hinweis: Dies funktioniert möglicherweise nicht auf Nicht-Unix-Systemen.quelle
except
Klausel angeben . Andernfallsexcept
wird alles abgefangen und kann nicht verwandte Fehler maskieren. Der Typ hier sollte seinsocket.error
.Aus " IPv6-Regex ":
quelle
Ich müsste die Antwort von Frank Krueger stark unterstützen .
Während Sie sagen, dass Sie einen regulären Ausdruck benötigen, um mit einer IPv6-Adresse übereinzustimmen, gehe ich davon aus, dass Sie wirklich überprüfen müssen, ob eine bestimmte Zeichenfolge eine gültige IPv6-Adresse ist. Hier gibt es eine subtile, aber wichtige Unterscheidung.
Es gibt mehrere Möglichkeiten, um zu überprüfen, ob eine bestimmte Zeichenfolge eine gültige IPv6-Adresse ist, und die Übereinstimmung mit regulären Ausdrücken ist nur eine Lösung.
Verwenden Sie eine vorhandene Bibliothek, wenn Sie können. Die Bibliothek weist weniger Fehler auf und ihre Verwendung führt zu weniger Code, den Sie warten müssen.
Der von Factor Mystic vorgeschlagene reguläre Ausdruck ist lang und komplex. Es funktioniert höchstwahrscheinlich, aber Sie sollten auch überlegen, wie Sie damit umgehen würden, wenn es unerwartet fehlschlägt. Der Punkt, den ich hier ansprechen möchte, ist, dass Sie einen erforderlichen regulären Ausdruck nicht einfach debuggen können, wenn Sie ihn nicht selbst erstellen können.
Wenn Sie keine geeignete Bibliothek haben, ist es möglicherweise besser, eine eigene IPv6-Validierungsroutine zu schreiben, die nicht von regulären Ausdrücken abhängt. Wenn Sie es schreiben, verstehen Sie es und wenn Sie es verstehen, können Sie Kommentare hinzufügen, um es zu erklären, damit andere es auch verstehen und anschließend pflegen können.
Seien Sie vorsichtig, wenn Sie einen regulären Ausdruck verwenden, dessen Funktionalität Sie niemand anderem erklären können.
quelle
return ex1.match(S) && ! ex2.match(S)
).Ich bin kein Ipv6-Experte, aber ich denke, mit diesem können Sie leichter ein ziemlich gutes Ergebnis erzielen:
zu antworten "ist ein gültiges ipv6" es sieht für mich ok aus. Um es in Teile zu zerlegen ... vergiss es. Ich habe die nicht spezifizierte Adresse (: :) weggelassen, da es keinen Sinn macht, "nicht spezifizierte Adresse" in meiner Datenbank zu haben.
Der Anfang:
^([0-9A-Fa-f]{0,4}:){2,7}
<- Entspricht dem komprimierbaren Teil. Wir können dies wie folgt übersetzen: zwischen 2 und 7 Doppelpunkten, zwischen denen möglicherweise eine Heaxadezimalzahl steht.gefolgt von:
[0-9A-Fa-f]{1,4}$
<- einer Hexadezimalzahl (führende 0 weggelassen) ODER((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}
<- einer Ipv4-Adressequelle
start() = 0, end() = 3 group(0) = "::1" group(1) = ":" group(2) = "1" group(3) = "null" group(4) = "null" group(5) = "null"
Dies fängt auch den Loopback (:: 1) und die IPv6-Adressen ab. änderte {} in + und setzte: in die erste eckige Klammer.
getestet mit ifconfig -a Ausgabe http://regexr.com/
Die Option Unix oder Mac OSx Terminal o gibt nur die übereinstimmende Ausgabe (ipv6) zurück, einschließlich :: 1
Holen Sie sich alle IP-Adressen (IPv4 ODER IPv6) und drucken Sie die Übereinstimmung unter Unix OSx
quelle
ip a | grep -Po '[\w:]+:+[\w:]+'
Dieser reguläre Ausdruck stimmt mit gültigen IPv6- und IPv4-Adressen gemäß der GNU C ++ - Implementierung von Regex mit dem verwendeten REGULAR EXTENDED-Modus überein:
quelle
In acht nehmen! In Java kann die Verwendung von InetAddress und verwandten Klassen (Inet4Address, Inet6Address, URL) Netzwerkverkehr beinhalten! ZB DNS-Auflösung (URL.equals, InetAddress from string!). Dieser Anruf kann lange dauern und blockiert!
Für IPv6 habe ich so etwas. Dies behandelt natürlich nicht die sehr subtilen Details von IPv6, da Zonenindizes nur für einige Klassen von IPv6-Adressen zulässig sind. Und dieser reguläre Ausdruck ist nicht für die Gruppenerfassung geschrieben, sondern nur ein regulärer Ausdruck für Übereinstimmungen.
S
- IPv6-Segment =[0-9a-f]{1,4}
I
- IPv4 =(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9]{1,2})\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9]{1,2})
Schema (erster Teil stimmt mit IPv6-Adressen mit IPv4-Suffix überein, zweiter Teil stimmt mit IPv6-Adressen überein, letzter Patrt des Zonenindex):
Und hier könnte der reguläre Ausdruck (Groß- und Kleinschreibung nicht berücksichtigen, umgeben mit dem, was jemals benötigt wurde, wie Anfang / Ende der Zeile usw.):
quelle
Der folgende reguläre Ausdruck gilt nur für IPv6. Gruppe 1 stimmt mit der IP überein.
quelle
Ein einfacher regulärer Ausdruck, der übereinstimmt, den ich jedoch für die Validierung jeglicher Art nicht empfehlen würde, ist folgender:
Beachten Sie, dass dies mit der Komprimierung an einer beliebigen Stelle in der Adresse übereinstimmt, jedoch nicht mit der Loopback-Adresse :: 1. Ich halte dies für einen vernünftigen Kompromiss, um den regulären Ausdruck einfach zu halten.
Ich verwende dies erfolgreich in den Smart-Auswahlregeln von iTerm2 , um auf IPv6-Adressen zu klicken.
quelle
A-F
nichtA-Z
! Beachten Sie auch, dass Sie die Punkt-Quad-Notation ausschließen.Wenn Sie Perl verwenden, versuchen Sie Net :: IPv6Addr
NetAddr :: IP
Validate :: IP
quelle
In der ScalaVerwenden Sie die bekannten Apache Commons-Validatoren.
http://mvnrepository.com/artifact/commons-validator/commons-validator/1.4.1
Befolgen Sie die Tests der Methode
ip(ip: String)
:quelle
1200:0000:AB00:1234:0000:2552:7777:1313
ist beispielsweise ein gültiges Format für eine IPv6-Adresse, jedoch keine gültige IPv6-Adresse, da die Testmethode zurückgibt. Ich wette, es241.54.113.65
ist eine gültige IPv4-Adresse.Wenn man sich die in den anderen Antworten enthaltenen Muster ansieht, gibt es eine Reihe guter Muster, die durch Referenzieren von Gruppen und Verwenden von Lookaheads verbessert werden können. Hier ist ein Beispiel für ein Muster, das sich selbst referenziert und das ich in PHP verwenden würde, wenn ich müsste:
Hinweis: PHP verfügt über einen integrierten Filter, der eine bessere Lösung als dieses Muster darstellt.
Regex101-Analyse
quelle
Ich habe folgendes mit Python generiert und arbeite mit dem Re-Modul. Die Vorausschau-Zusicherungen stellen sicher, dass die richtige Anzahl von Punkten oder Doppelpunkten in der Adresse angezeigt wird. IPv4 in IPv6-Notation wird nicht unterstützt.
quelle
Regexes für IPv6 können sehr schwierig werden, wenn Sie Adressen mit eingebettetem IPv4 und komprimierte Adressen berücksichtigen, wie Sie aus einigen dieser Antworten ersehen können.
Die Open-Source-IPAddress-Java-Bibliothek validiert alle Standarddarstellungen von IPv6 und IPv4 und unterstützt auch die Präfixlänge (und deren Validierung). Haftungsausschluss: Ich bin der Projektmanager dieser Bibliothek.
Codebeispiel:
quelle
In Java können Sie die Bibliotheksklasse verwenden
sun.net.util.IPAddressUtil
:quelle
Es ist schwierig, einen regulären Ausdruck zu finden, der für alle IPv6-Fälle funktioniert. Sie sind normalerweise schwer zu warten, nicht leicht lesbar und können Leistungsprobleme verursachen. Daher möchte ich eine alternative Lösung vorstellen, die ich entwickelt habe: RegEx (Regular Expression) für IPv6, getrennt von IPv4
Nun können Sie fragen: "Diese Methode findet nur IPv6. Wie kann ich IPv6 in einem Text oder einer Datei finden?" Hier finden Sie auch Methoden für dieses Problem.
Hinweis : Wenn Sie nicht IPAddress - Klasse in .NET verwenden möchten, können Sie es auch mit ersetzen meine Methode . Es werden auch zugeordnete IPv4- und Sonderfälle behandelt, während IPAddress dies nicht abdeckt.
quelle
InetAddressUtils
hat alle Muster definiert. Am Ende habe ich ihr Muster direkt verwendet und füge es hier als Referenz ein:quelle
Verwenden Sie Ruby? Versuche dies:
quelle
Abhängig von Ihren Bedürfnissen kann eine Annäherung wie:
kann ausreichen (wie zum Beispiel beim einfachen Greppen von Protokolldateien).
quelle
Für PHP 5.2+
filter_var
funktionieren Benutzer hervorragend.Ich weiß, dass dies nicht die ursprüngliche Frage beantwortet (speziell eine Regex-Lösung), aber ich poste dies in der Hoffnung, dass es in Zukunft jemand anderem helfen kann.
quelle
Dies funktioniert für IPv4 und IPv6:
quelle
::
. zB2404:6800::4003:c02::8a
Hier ist, was ich mir ausgedacht habe, mit ein bisschen Lookahead und benannten Gruppen. Dies ist natürlich nur IPv6, sollte jedoch zusätzliche Muster nicht beeinträchtigen, wenn Sie IPv4 hinzufügen möchten:
quelle
Sie können die ipextract-Shell-Tools verwenden ich für diesen Zweck erstellt habe. Sie basieren auf Regexp und Grep.
Verwendung:
quelle
Nur passende lokale von einem Ursprung mit eckigen Klammern enthalten. Ich weiß, dass es nicht so umfassend ist, aber in Javascript hatten die anderen Schwierigkeiten, Probleme zu verfolgen, vor allem die, nicht zu funktionieren. Das scheint mir das zu bringen, was ich jetzt brauchte. AF mit zusätzlichen Hauptstädten wird ebenfalls nicht benötigt.
Jinnkos Version ist vereinfacht und besser sehe ich.
quelle
Wie oben erwähnt, besteht eine andere Möglichkeit, einen Parser zur Überprüfung der IPv6-Textdarstellung zu erhalten, in der Programmierung. Hier ist eine, die vollständig mit RFC-4291 und RFC-5952 kompatibel ist. Ich habe diesen Code in ANSI C geschrieben (funktioniert mit GCC, hat Tests unter Linux bestanden - funktioniert mit Clang, hat Tests unter FreeBSD bestanden). Daher ist es nur auf die ANSI C-Standardbibliothek angewiesen, sodass es überall kompiliert werden kann (ich habe es für die IPv6-Analyse in einem Kernelmodul mit FreeBSD verwendet).
quelle
Probieren Sie diesen kleinen Einzeiler. Es sollte nur mit gültigen unkomprimierten / komprimierten IPv6-Adressen übereinstimmen (keine IPv4-Hybride).
quelle
Der reguläre Ausdruck ermöglicht die Verwendung führender Nullen in den IPv4-Teilen.
Einige Unix- und Mac-Distributionen konvertieren diese Segmente in Oktale.
Ich schlage vor,
25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d
als IPv4-Segment zu verwenden.quelle
Wenn Sie nur normale IP-Adressen (keine Schrägstriche) möchten, hier:
Ich verwende es für meinen Syntax-Textmarker in der Hosts-Datei-Editor-Anwendung. Wirkt als Charme.
quelle