Perl regulären Ausdruck, eine IP-Adresse
Schreibe ich diesen code, aber es funktioniert nicht.
Kann jemand darauf hin, das Problem?
sub match_ip()
{
my $ip = "The IP address is 216.108.225.236:60099";
if($ip =~ /(\d{1-3}\.\d{1-3}\.\d{1-3}\.\d{1-3}\:\d{1-5})/)
{
print "$1\n";
}
}
BEARBEITEN:
Ich wollte nur extrahieren Sie die IP-Adresse, nicht an die Validierung.
- Statt zu schreiben Ihre eigenen regex möchten Sie vielleicht zu prüfen, mit einem gut dokumentierten und getesteten module f.ex. Regexp::Common
- Es gibt mehr als ein paar Probleme hier. Verwenden Sie eines der Module, oder schauen Sie auf all die Dinge, die Module tun, um es richtig zu machen. 🙂
- Sind Sie versuchen, zu überprüfen oder einfach nur extrahieren Sie die IP-Adresse? Verursachen Sie einen schrecklichen job des ehemaligen.
- Ich will nur extrahieren, nicht überprüfen
- Gut, Sie will auch nicht zu extrahieren Dinge, die nicht sein können, IP-Adressen, so dass die Validierung, die ist extrem einfach zu tun, hilft bei der Reduzierung der false-positives.
- Die Sache ist die, nur für die überprüfung, ich möchte nicht, dass meine script-abhängig von einem beliebigen Modul. Ich gehe davon aus, dass nur gültige IP-Adresse in der Datei die ich bin-Verarbeitung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ändern
{1-3}
zu{1,3}
gleiche für{1-5}
->{1,5}
In den Geist der TIMTOWTDI hier ist ein anderes: die
Regexp::Common::net
TeilRegexp::Common
haben kann regexen, die Sie wünschen.Alternativ können Sie
Data::Validate::IP
, mit dem VORBEHALT, dass es nicht erkennt, den Hafen, also müssen Siesplit
auf:
.Ausgabe:
Ersetzen Sie die Striche durch Kommas.
Zwar gibt es gut dokumentierte und getestete Module auf CPAN zu entsprechen und überprüfen von IP-Adressen, aber es muss einen festen Grund für Sie, es nicht zu verwenden. Ich persönlich hatte nie einen wirklichen Grund Sie zu verwenden für die Validierung Zweck, da ich trusted/gefüttert die Eingabe.
Hier ist eine kürzere version von deinem regex, mit seinen eigenen Tücken:
Ergebnisse:
Erklärung:
Hoffe, das hilft.
333.108.225.236:123
ist eine ungültige IP-Adresse, aber würde Ihren pass zu überprüfen.Dies könnte helfen:
Ausgabe:
http://metacpan.org/pod/Regexp::Common::net
Wenn Sie extrahieren eine IP-Adresse, nicht eine IP-Adresse... Sie sind nicht das extrahieren der richtige.
if condition
, die geschrieben werden können mit der ersten wie in diesemif($str =~ m/(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/ && ($1<=255 && $2<=255 && $3<=255 && $4<=255 ))
Versuchen Sie dies:
Können Sie auch mit der folgenden regex, um sicherzustellen, dass die quad ' s sind nicht größer als 255, so wird es auch "greift" die Ziffer matching anstelle von copypasting es 4 mal.
Es verwendet einige features aus perl-regex-matching (man perlre):
[0-255]
im regex nicht zu tun, was Sie tun sollten.