Frage

Also brauche ich eine IPv6-Adresse übereinstimmen, die keine Maske haben oder nicht. Leider kann ich nicht nur eine Bibliothek verwenden, um die Zeichenfolge zu analysieren.

Die Maske Bit ist einfach genug, in diesem Fall:

(?:\/\d{1,3})?$/

Der schwierige Teil ist die verschiedenen Formate einer IPv6-Adresse. Es braucht :: Rindfleisch, Rindfleisch ::, Rindfleisch :: Rindfleisch anzupassen, etc.

Ein Update: Ich bin fast da ..

/^(\:\:([a-f0-9]{1,4}\:){0,6}?[a-f0-9]{0,4}|[a-f0-9]{1,4}(\:[a-f0-9]{1,4}){0,6}?\:\:|[a-f0-9]{1,4}(\:[a-f0-9]{1,4}){1,6}?\:\:([a-f0-9]{1,4}\:){1,6}?[a-f0-9]{1,4})(\/\d{1,3})?$/i

Ich bin in diesem Fall beschränkt Perl Regex verwenden.

War es hilfreich?

Lösung

Diese enthält einen Patch Regexp :: Allgemeines Demonstrieren ein vollständiger, genauer, getestet IPv6 regex. Es ist eine gerade Übersetzung der IPv6-Grammatik. Regexp :: IPv6 ist auch korrekt.

Noch wichtiger ist, es enthält eine Testsuite. Laufen Sie es mit Ihrem regulären Ausdruck zeigt, du bist immer noch eine Art und Weise ab. 10 von 19 verpasst. 1 von 12 falsch positiven Ergebnissen. IPv6 enthält eine Menge von speziellen Kürzeln macht es sehr einfach, auf subtile Weise falsch zu erhalten.

Die beste Ort auf zu lesen, was eine IPv6-Adresse geht in RFC 3986 Abschnitt 3.2.2.

Andere Tipps

Was meinst du man kann nicht einfach eine Bibliothek benutzen? Wie wäre es ein Modul? Regexp::IPv6 wird dir geben, was Sie brauchen.

Ich bin kein IPv6-Experte, aber bitte glauben Sie mir, wenn ich Ihnen sagen, dass bei der Anpassung (geschweige denn die Validierung) IPv6-Adressen mit einem sehr einfachen Regex wie das nicht einfach ist, vor. Es gibt viele Kürzel und verschiedene Konventionen für die Adresse mit einem Port kombiniert, um nur ein Beispiel zu nennen. Eine solche Stenografie ist, dass Sie schreiben 0: 0: 0: 0: 0: 0: 0: 1 als :: 1, aber es gibt noch mehr. Wenn Sie Deutsch lesen, würde ich die Dias von Steffen Ullrich Vortrag suchen vorschlagen am 11. deutschen Perl-Workshop.

Sie sagen, Sie nicht eine Bibliothek verwenden können, aber wenn Sie die ganze Komplexität der Bibliothek neu zu erfinden gehen, dann könnte man auch importieren nur wörtlich in Ihr Projekt.

Das meist funktioniert ...

^([0-9a-fA-F]{0,4}|0)(\:([0-9a-fA-F]{0,4}|0)){7}$

Nachteile: :: ähnlichen Fällen nicht korrekt behandelt

Versuchen Sie folgendes:

^([0-9a-fA-F]{4}|0)(\:([0-9a-fA-F]{4}|0)){7}$

Bibliothek für reguläre Ausdrücke: IPv6-Adresse

Sie sollten auch dies lesen: Ein regulärer Ausdruck für IPv6-Adressen

Wenn Sie in Perl-Check benötigen, ob ein String eine IPv6 Adresse, die Sie dies ausprobieren können:

if (/(([\da-f]{0,4}:{0,2}){1,8})/i) { print("$1") };

Versuchen:

/^(((?=(?>.*?(::))(?!.+\3)))\3?|([\dA-F]{1,4}(\3|:(?!$)|$)|\2))(?4){5}((?4){2}|((2[0-4]|1\d|[1-9])?\d|25[0-5])(\.(?7)){3})\z/ai

Von: http://home.deds.nl/~aeron/regex/

Hier ist die eine für alle Beispiele von IPv6 arbeitete ich habe es geschafft, zu finden:

/^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/

stellen Sie sicher, es ist die eine Zeile vor der Verwendung. es ist hier gefunden:

https: //community.helpsystems .com / Foren / InterMapper / Sonstiges-Themen / 5acc4fcf-FA83-e511-80cf-0050568460e4

prüfe auf alle Beispielen aus der Fragenseite, die Community-Seite und die Wikipedia-Seite von hier:

https://en.wikipedia.org/wiki/IPv6

das Werkzeug für die Überprüfung von hier die man verwendet:

https://regex101.com/

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