Regulären Ausdruck entspricht, gültige IPv6-Adressen
Ich habe Probleme beim schreiben eines regulären Ausdrucks übereinstimmt gültige IPv6-Adressen, einschließlich derjenigen, die in Ihrer komprimierten form (mit ::
oder führenden Nullen ausgelassen werden aus jedem byte-pair-Mädchen).
Kann jemand empfehlen, einen regulären Ausdruck, erfüllen die Anforderung?
Ich bin angesichts des expandierenden jedes byte-pair-matching und das Ergebnis mit einfacher regex.
Check out intermapper.com/ipv6validator.. es links zu dieser perl-test-script
Ich habe versucht all die Antworten und arbeiten Sie nicht für alle meine Testfälle und/oder Sie beinhalten auch eine IPv4, das war nicht gefragt. Ich habe festgestellt, dass dies die sauberste Lösung so weit: stackoverflow.com/a/21944928/3112803
Ich habe versucht all die Antworten und arbeiten Sie nicht für alle meine Testfälle und/oder Sie beinhalten auch eine IPv4, das war nicht gefragt. Ich habe festgestellt, dass dies die sauberste Lösung so weit: stackoverflow.com/a/21944928/3112803
InformationsquelleAutor Readonly | 2008-09-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
War ich nicht in der Lage zu bekommen @Faktor Mystische Antwort auf das arbeiten mit der POSIX regulären Ausdrücke, also schrieb ich ein, dass die arbeiten mit POSIX reguläre Ausdrücke und reguläre PERL-Ausdrücke.
Sollte es passen:
IPv6 Regulären Ausdruck:
Lesen zu erleichtern, werden die folgenden der oben genannten regulären Ausdruck split bei den großen, ODER Punkte, die in separaten Zeilen:
Machen die oben leichter zu verstehen, werden die folgenden "pseudo-code", wird die oben:
Ich geschrieben ein Skript auf GitHub, die tests mit dem regulären Ausdruck: https://gist.github.com/syzdek/6086792
127.000.000.001
IPv4-Segmente sollte nicht führende Nullen enthalten. Wenn eine führende null vorhanden ist, wird die IPv4-segment interpretiert werden sollten in oktal. Also die IPV4SEG oben ist korrekt in nicht erlaubt '000'. Es hat jedoch gestatten, '00', was es nicht sein sollte.
Hat bei mir nicht funktioniert, im browser, wie ich es erwarten würde. Validiert, auch reg.test('3zzzzffe:1900:4545:3:200:f8ff:fe21:67cf"), die offensichtlich nicht um eine gültige IPv6-Adresse. Hatte viel bessere Ergebnisse mit regex hier: nbviewer.ipython.org/github/rasbt/python_reference/blob/master/...
fantastische ipv6-regex. einen kleinen Fehler mit der link-local-Bereich. Sie hatte
fe80
wo es sollte so etwas wie[fF][eE]80
und einffff
denen sollte so etwas wie[fF]{4}
+1 für die zeigen, dass regexes werden kann (in der gleichen Weise wie jeder source-code) tatsächlich lesbar sind, wenn Sie nehmen Sie die Pflege und formatieren Sie Sie.
InformationsquelleAutor David M. Syzdek
Den folgenden überprüft, ob Sie IPv4 -, IPv6 - (voll-und komprimiert) und IPv6v4 (voll-und komprimierte) Adressen:
Hi, getestet habe ich diese RegExp und nicht für mich gearbeitet. Es sagt D ist ein ungültiges flag verwendet wird, und wenn ich es entfernen er sagt: "SyntaxError: invalid Quantifizierer"
JavaScript implementiert ein subset von Perl-Stil reguläre Ausdrücke, nicht die Gesamtheit von PCRE. Mein regex funktioniert nicht, ohne einige der erweiterten Funktionen von PCRE.
Dies gibt Ausnahme für mich in C#
Fehlerhaften Testfall: FE80:0000:0000:0000:0202:B3FF:FE1E:8329 unter Verwendung der neuesten version von Elixir auf das Datum, das verwendet PCRE darunter.
InformationsquelleAutor
Vom "IPv6-regex":
Who cares, wenn es funktioniert?
jeder, der gesehen hat, eine code-Basis, die mit Bausünden wie das
Wie über den port?
Dies ist eine völlig unnötige Travestie, REs. Das Programm, das Sie erzeugt nicht verstehen, was es macht. Ein Mensch würde das nie tun, es auf diese Weise. Lassen Sie sich nicht täuschen durch die scheinbare Komplexität - REs sind ja "schwarze Magie" für viele Menschen, aber es gibt keinen Grund, legen Sie Sie auf einem anderen Planeten!
InformationsquelleAutor Factor Mystic
Es klingt wie Sie möglicherweise verwenden Python. Wenn ja, können Sie etwas wie dieses:
Ich glaube nicht, dass Sie haben, um IPv6 kompiliert in Python zu bekommen
inet_pton
, die können auch analysieren IPv4-Adressen wenn Siesocket.AF_INET
als ersten parameter. Hinweis: dies funktioniert nicht auf nicht-Unix-Systeme.except
- Klausel. Ansonstenexcept
fangen alles und kann die Maske nicht damit zusammenhängende Fehler. Der Typ sollte hiersocket.error
.A) inet_pton nicht werfen anderen Ausnahmen, es sei denn, die Dokumente sind falsch, und B) selbst wenn es das täte, was würden Sie sonst noch zurück, aber Falsch?
Re: anderer Fehler... wenn der Benutzer geht in einem nicht-string, TypeError wird gegessen. Klar die Liste ist nicht ipv6, aber ich würde wahrscheinlich wollen, haben es auf Karpfen, ich war vorbei, in der falsche Typ.
+1 Das hat mir sehr geholfen. Ein paar zusätzliche Punkte, die Hinzugefügt werden soll: 1) - Buchse.inet_pton kann verwendet werden, testen Sie die Gültigkeit der beiden Familien von IP-Adressen (IP-und IPv6). 2) Die docs hier (docs.python.org/2/library/socket.html) nahe, dass diese auf Unix-Plattformen. Es kann nicht auf Win-Plattformen.
mit django und das hilft!
InformationsquelleAutor Joe Hildebrand
Ich würde dringend die zweite die Antwort von Frank Krüger.
Während Sie sagen, müssen Sie einen regulären Ausdruck, der eine IPv6-Adresse, ich gehe davon aus, dass das, was Sie wirklich brauchen, ist zu überprüfen, ob ein gegebener string eine gültige IPv6-Adresse. Es ist ein subtiler, aber wichtiger Unterschied hier.
Gibt es mehr als eine Möglichkeit zu prüfen ob ein gegebener string eine gültige IPv6-Adresse und reguläre Ausdrücke nur eine Lösung.
Verwenden Sie eine vorhandene Bibliothek, wenn Sie können. Die Bibliothek wird weniger bugs und seine Verwendung führt zu weniger code für Sie zu pflegen.
Den regulären Ausdruck vorgeschlagen, die von Faktor Mystic ist lang und Komplex. Es wahrscheinlich funktioniert, aber Sie sollten auch betrachten, wie würden Sie zurechtkommen, wenn es unerwartet ausfällt. Der Punkt, den ich versuche zu machen ist hier, dass, wenn Sie nicht form einer gewünschten regulären Ausdruck selbst werden Sie nicht in der Lage, leicht zu Debuggen.
Wenn man keine geeignete Bibliothek, ist es vielleicht besser zu schreiben, Ihre eigene IPv6-Validierungs-routine, die nicht davon abhängig, reguläre Ausdrücke. Wenn Sie es schreiben Sie es verstehen und wenn Sie das verstehen, können Sie Kommentare hinzufügen, um es zu erklären, so dass andere auch verstehen und anschließend zu pflegen.
Handeln Sie mit Vorsicht, wenn Sie mit einem regulären Ausdruck, dessen Funktionalität man nicht erklären kann, um jemand anderes.
return ex1.match(S) && ! ex2.match(S)
).Sie gehen davon aus, dass er die Validierung von einzelnen IPs, wenn er fast sicher auf der Suche für IPs in einem großen Textblock.
InformationsquelleAutor Jon Cram
Ich bin kein Ipv6 Experte, aber ich denke, dass kann man ein Recht gutes Ergebnis leichter mit diesem hier:
beantworten "ist eine gültige ipv6 -" es Aussehen ok für mich. Um es zu brechen in Teile... vergiss es. Habe ich weggelassen, die nicht spezifiziert (::), da gibt es keine Verwendung zu haben "unpecified Adresse" in meine Datenbank.
den Anfang:
^([0-9A-Fa-f]{0,4}:){2,7}
<-- match das kompressible Teil, können wir es übersetzen als: zwischen 2 und 7 Doppelpunkt, der möglicherweise heaxadecimal Zahl zwischen Ihnen.gefolgt von:
[0-9A-Fa-f]{1,4}$
<-- eine hexadezimale Zahl (führende 0 weggelassen werden).ODER
((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}
<-- eine Ipv4-AdresseDiese don ' T match "::1"
Huh? In java-regex-syntaxt passt:
start() = 0, end() = 3 group(0) = "::1" group(1) = ":" group(2) = "1" group(3) = "null" group(4) = "null" group(5) = "null"
Woanders jemanden Benachrichtigen Sie mich über ein problem mit meinem regex, komprimierte Teil "::" nur einmal vorkommen kann. So ist "::1::2" würde passen mit meinem regex, aber es ist nicht eine gültige IPV6. Eine zweite regex überprüfen kann diesem Fall. Die vollständige Empfehlung war die Verwendung eines stateful-parser zu validieren. Ich bin damit einverstanden, dass der resultierende code wird leichter zu Lesen und zu warten (und jemand vielleicht schon codiert es in einer open-source irgendwo).
InformationsquelleAutor Remi Morin
Dieser reguläre Ausdruck mit gültige IPv6-und IPv4-Adressen, die in übereinstimmung mit dem GNU-C++ - Umsetzung von regex mit REGELMÄßIGEN EXTENDED Modus verwendet wird:
InformationsquelleAutor janCoffee
Achtung! In Java ist die Verwendung von InetAddress und Verwandte Klassen (Inet4Address, Inet6Address, URL) kann auch Netzwerk-trafic! E. g. DNS-Auflösung (URL.gleich, InetAddress from string!). Dieser Aufruf kann lange dauern und blockiert!
Für IPv6 habe ich so etwas wie dieses. Das macht natürlich nicht mit den feinen details von IPv6 wie zone Indizes sind nur gestattet, auf einige Klassen von IPv6-Adressen. Und dieser regex ist nicht geschrieben für die Gruppe aufnehmen, es ist nur ein "entspricht" Art von regexp.
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})
Schaltplan (der erste Teil entspricht der IPv6-Adressen mit IPv4-suffix, der zweite Teil entspricht IPv6-Adressen, im letzten patrt die zone index):
Und hier könnte die regex (groß-und Kleinschreibung, umgeben mit dem, was jemals benötigt wie Anfang/Ende der Zeile, usw.):
InformationsquelleAutor user2623580
Einem einfachen regex übereinstimmt, aber ich würde nicht empfehlen für die Validierung jeglicher Art ist diese:
Hinweis: dies entspricht der Kompression überall in der Adresse, obwohl es wird nicht mit dem loopback-Adresse ::1 ist. Ich finde dies einen vernünftigen Kompromiss, um den regex einfach.
Habe ich erfolgreich in iTerm2 intelligente Auswahl-Regeln quad-klicken Sie auf IPv6-Adressen.
A-F
, nichtA-Z
! Beachten Sie auch, dass Sie ohne dotted-quad-notation.InformationsquelleAutor JinnKo
Wenn Sie mit Perl versuchen Net::IPv6Addr
NetAddr::IP
Validate::IP
InformationsquelleAutor Brad Gilbert
Dieser fängt den loopback(::1) gut-und ipv6-Adressen.
geändert {} + und setzen : in der ersten eckigen Klammer.
getestet mit ifconfig-a die Ausgabe
http://regexr.com/
Unix-oder Mac OSx-terminal a-option gibt nur die passende Ausgabe(ipv6) inklusive: 1
Erhalten Sie Alle IP-Adressen (IPv4 ODER IPv6) und Druck-match auf unix OSx Begriff
ip a | grep -Po '[\w:]+:+[\w:]+'
Humor geschätzt!
InformationsquelleAutor Rohit Malgaonkar
In Scala verwenden Sie den bekannten Apache-Commons-Prüfungen.
http://mvnrepository.com/artifact/commons-validator/commons-validator/1.4.1
Folgenden der test der Methode
ip(ip: String)
:1200:0000:AB00:1234:0000:2552:7777:1313
ist ein gültiges format für eine IPv6-Adresse, aber es ist nicht eine gültige IPv6-Adresse als test-Methode gibt. Ich Wette, er denkt241.54.113.65
ist eine gültige IPv4-Adresse.InformationsquelleAutor OliverKK
Es ist schwierig, einen regulären Ausdruck funktioniert für alle IPv6-Fällen. Sie sind in der Regel schwer zu pflegen, nicht leicht lesbaren und möglicherweise zu Leistungsproblemen führen. Daher möchte ich eine alternative Lösung, die ich entwickelt habe: Regulärer Ausdruck (RegEx) für IPv6 Getrennt von IPv4
Nun mögen Sie sich Fragen, "dass Diese Methode nur IPv6 findet, wie finde ich die IPv6 in eine text-Datei oder?" Hier sind Methoden für dieses Problem auch.
Hinweis: Wenn Sie nicht möchten, zu verwenden IPAddress-Klasse .NET, Sie können auch ersetzen Sie es mit meine Methode. Es umfasst auch zugeordnete IPv4-und Spezial-Fällen, während die IP-Adresse nicht abgedeckt werden.
InformationsquelleAutor Nuh Metin Güler
InetAddressUtils
hat alle Muster definiert. Ich endete-mit Ihrem Muster direkt, und bin einfügen hier zur Referenz:InformationsquelleAutor user4604205
Blick auf die Muster enthalten, die in den anderen Antworten gibt es eine Reihe von guten mustern, die verbessert werden können durch die Referenzierung von Gruppen und die Nutzung von lookaheads. Hier ist ein Beispiel für ein Muster, das ist selbst-referenzierend, ich würde nutzen in PHP, wenn ich musste:
Hinweis: PHP hat einen eingebauten filter für diese, das wäre eine bessere Lösung als diese
Muster.
Regex101 Analyse
InformationsquelleAutor Steve Buzonas
Ruby? Versuchen Sie dies:
InformationsquelleAutor Ahamx
Je nach Ihren Bedürfnissen, eine Annäherung, wie:
ausreichend sein kann (wie mit einfachen log-Datei grepping, zum Beispiel.)
InformationsquelleAutor Bill Lipa
Folgenden regex ist für IPv6. Gruppe 1 matches mit der IP.
dies würde nicht übereinstimmen, sagen: fe80::1 oder 2342:32fd::2d32
InformationsquelleAutor Jitendra Gosavi
In Java, können Sie die Bibliothek-Klasse
sun.net.util.IPAddressUtil
:InformationsquelleAutor user463639
Für PHP 5.2+ Benutzer
filter_var
Super funktioniert.Ich weiß, das beantwortet nicht die ursprüngliche Frage (speziell eine regex-Lösung), aber ich poste das, in der Hoffnung, Sie kann helfen, jemand anderes in der Zukunft.
InformationsquelleAutor Wireblue
Dieser Arbeit wird für IPv4 und IPv6:
::
. z.B.2404:6800::4003:c02::8a
passt ungültige IPv4-666.666.666.666
InformationsquelleAutor Chris
Hier ist, was ich kam mit, mit ein bisschen lookahead und benannte Gruppen. Dies ist natürlich nur IPv6, aber Sie sollten nicht mit zusätzlichen Muster, wenn Sie möchten, fügen Sie die IPv4:
InformationsquelleAutor user1977022
Können Sie die ipextract shell tools ich für diesen Zweck hergestellt. Sie basieren auf regexp und grep.
Verwendung:
InformationsquelleAutor Phil L.
Generiert ich die folgenden using-python und arbeitet mit dem re-Modul. Die look-ahead-assertions sicherzustellen, dass die richtige Anzahl von Punkten oder Doppelpunkten angezeigt, in der Adresse. Es unterstützt keine IPv4-in IPv6-notation.
InformationsquelleAutor Mike Wilmes
Nur passenden lokalen, von einem Ursprung mit eckigen Klammern enthalten. Ich weiß, es ist nicht so umfassend, aber in javascript, die anderen hatten schwer zu verfolgen, Fragen in Erster Linie, dass der nicht funktioniert, so scheint dies für mich zu bekommen, was ich brauchte jetzt. extra Hauptstädte A-F sind nicht erforderlich.
Jinnko version ist vereinfacht und besser sehe ich.
InformationsquelleAutor Master James
Wird, wie oben angegeben, ein weiterer Weg, um eine IPv6-textliche Darstellung Validierung parser zu Programmieren. Hier ist eine, die ist vollständig kompatibel mit RFC 4291 RFC-5952. Ich habe geschrieben diesen code in ANSI-C (arbeitet mit GCC), der bestandenen tests auf Linux - funktioniert auch mit clang, der bestandenen tests auf FreeBSD). So, es tut nur verlassen sich auf den ANSI-C-standard-Bibliothek, so kann es kompiliert werden überall (ich habe es verwendet für IPv6-parsing innerhalb eines kernel-Moduls mit FreeBSD).
InformationsquelleAutor Alexandre Fenyo
Regexes für ipv6 kann man wirklich schwierig, wenn man bedenkt, Adressen mit eingebetteten ipv4-Adressen, die komprimiert werden, wie Sie sehen können, die von einigen dieser Antworten.
Die open-source-IP-Adresse Java-Bibliothek wird, überprüfen Sie alle standard-Darstellungen von IPv6-und IPv4-und unterstützt auch die Präfix-Länge (und Validierung eines solchen). Disclaimer: ich bin der Projekt manager der Bibliothek.
Code Beispiel:
InformationsquelleAutor Sean F
Versuchen, diese kleine one-liner. Es sollte nur entsprechen, gilt nicht komprimierte/komprimierte IPv6-Adressen (keine IPv4-Hybriden)
InformationsquelleAutor Carlos Velazquez
Regex ermöglicht die Verwendung von führenden Nullen in der IPv4-Teile.
Einige Unix-und Mac-Distributionen konvertieren diese Segmente in octals.
Schlage ich vor, mit
25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d
als IPv4-segment.InformationsquelleAutor Aeron
Wenn Sie wollen nur normale IP-s (ohne Schrägstriche), hier:
Ich benutze es für mein syntax-highlighter in der hosts-Datei-editor-Anwendung. Funktioniert wie Charme.
(?:[0-9a-f]{1,4}(?:::?)?){0,7}::?[0-9a-f]{1,4}
Immer noch falsch, aber selbst dann werden Sie am Ende wiederholen JinnKo Antwort, die ist gut genug für einfache Zwecke, aber hat immer noch Fehler (nicht fangen Doppel-Verdichtung und nicht zulassen dotted quads, noch localhost, nor :: Kündigung, ...)
InformationsquelleAutor Harry