Wie kann ich mit IPv6-Adressen mit einem Perl-regex?
Also ich muss eine ipv6-Adresse, die möglicherweise oder möglicherweise nicht über eine Maske. Leider kann ich nicht einfach eine Bibliothek zum Parsen der Zeichenfolge.
Die bit-Maske ist leicht genug, in diesem Fall:
(?:\/\d{1,3})?$/
Der schwierige Teil ist den verschiedenen Formaten, die eine ipv6-Adresse. Es muss passen ::Rindfleisch,::, Rind::Rindfleisch, 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 mit perl-regex.
- Ist dieses Hausaufgaben? Oder warum können Sie nicht verwenden, eine Bibliothek und was macht Sie sagen, dass Sie nur auf "perl-regex"?
- Die Sprache, die ich verwende, ist perl. Die änderungen, die erforderlich sind, damit die Verwendung von anderen Bibliotheken wäre mehr Arbeit. Definieren Hausaufgaben? Ich bin zu Hause und ich bin arbeiten. Es ist für eines der Projekte an dem ich arbeite - wenn du meinst für didaktische Zwecke, dann nicht.
- "Die änderungen, die erforderlich sind, damit die Verwendung von anderen Bibliotheken wäre mehr Arbeit." -- Ich bezweifle es. Zumindest nicht auf lange Sicht. Generell Perl ohne Module vom CPAN, ist nur die halbe Sprache. Die Weigerung, sogar mit reinen Perl-Modulen und dann andere zu Fragen, nach Lösungen zu bereits gelösten Problemen scheint... ineffizient.
- Was ändert sich? Es ist entweder
use SomeModule
oder Sie haben auf CPAN, laden Sie das Modul herunter und führen Sie eine kopieren und einfügen. - Gut, einer der coolen Dinge über perl ist es gibt Tausende von Möglichkeiten, Dinge zu tun, richtig? 🙂
- In der Tat. Es ist nur so, dass manche Wege sind viel besser als andere.
- Und im Idealfall diese Möglichkeiten sollten nicht zählen, andere zu Fragen, zu wiederholen Arbeit, die bereits geleistet wurde. Wenn Sie möchten, um einen anderen Weg finden, es zu tun, die Nüsse gehen, aber Sie fordern uns zu engagieren, nun auch.
- Gee, es gibt eine Menge von kritischen Antworten hier. Ich kann verstehen, dass die Anforderung für die Verwendung von Modulen. In einem großen Unternehmen manchmal ein Skript braucht, um zu gehen auf einem bestimmten server und Sie haben zu betteln, borgen und stehlen Erlaubnis zu erhalten, diesen server zu verwenden. Erste root-Zugriff und die Installation von Modulen ist ausgeschlossen. Das sagte ich oft, dies zu umgehen, indem Sie einfach kopieren Sie das Modul an derselben dir wie das Skript.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese beinhaltet einen patch, der von Regexp::Common demonstriert eine komplette, genaue, getestet IPv6-regex. Seine eine gerade übersetzung der IPv6-Grammatik. Regexp::IPv6 ist auch korrekt.
Wichtiger ist, es enthält eine test-suite. Läuft es mit deinem regex zeigt, dass Sie noch einen weiten Weg. 10 von 19 verpasst. 1 von 12 false-positives. IPv6 enthält eine Menge von speziellen Kürzeln macht es sehr einfach zu subtil falsch.
Beste Ort, um zu Lesen, was geht in eine IPv6-Adresse ist RFC 3986 Abschnitt 3.2.2.
Was meinst du können Sie nicht einfach eine Bibliothek? Wie wäre es mit einem Modul?
Regexp::IPv6
geben wird, was Sie brauchen.Ich bin kein IPv6 Experte, aber bitte Vertrauen Sie mir, wenn ich Ihnen sage, dass matching (geschweige denn, Validierung) von IPv6-Adressen wird nicht einfach, mit einer sehr einfachen regex wie die, die Sie vorschlagen. Es gibt viele Kürzel und verschiedene Konventionen zur Verbindung der Adresse mit einem port, um nur ein Beispiel. Eine solche Kurzform ist, dass Sie schreiben können 0:0:0:0:0:0:0:1 als ::1, aber es gibt noch mehr. Wenn Sie Deutsch Lesen, würde ich vorschlagen, Blick auf die Folien Steffen Ullrich sprechen am 11. deutscher Perl-Workshop.
Sagen Sie, dass Sie nicht verwenden können, eine Bibliothek, aber wenn Sie gehen zu erfinden, die ganze Komplexität der Bibliothek, dann könnten Sie genauso gut importieren, die es wörtlich in Ihrem Projekt.
Dieser funktioniert auch meistens...
Nachteile:
::
wie Fällen nicht korrekt behandeltVersuchen Sie dies:
Vom Regelmäßige Ausdruck Bibliothek: IPv6-Adresse
Sollten Sie auch Lesen: Ein Regulärer Ausdruck für IPv6-Adressen
Wenn Sie müssen in perl überprüfen, ob ein string ist eine IPv6-Adresse Sie können versuchen, diese:
Versuchen:
Aus:
http://home.deds.nl/~aeron/regex/
hier ist der war für alle die Beispiele von IPv6 habe ich es geschafft, zu finden:
stellen Sie sicher, es ist die eine Linie vor der Verwendung.
es wurde hier gefunden:
https://community.helpsystems.com/forums/intermapper/miscellaneous-topics/5acc4fcf-fa83-e511-80cf-0050568460e4
überprüft auf alle Beispiele, die aus der Frage-Seite, die community-Seite und der wikipedia-Seite hier:
https://en.wikipedia.org/wiki/IPv6
Werkzeug für die überprüfung verwendet wird, der einen von hier:
https://regex101.com/
command channel listening on ::1#xxx // DNS Socket created at [::], FD 3 // Accepting NAT intercepted HTTP Socket connections at local=[::]:xxxx remote=[::] FD 4 flags=33 // Accepting HTTP Socket connections at local=[::]:xxxx remote=[::] FD 5 flags=8 // listening on ::1 // listening on xxxx::xxxx:xxxx:xxxx:xxxx%eth0 // listening on xxxx::xxxx:xxxx:xxxx:xxxx%eth1 // session opened for user admin@::ffff:xxx.xxx.xxx.xxx