Thread RegEx: Daten im Format TT?.MM?.'?JJ: aber keine IP-Adressen (8 answers)
Opened by pktm at 2006-07-12 22:55

sid burn
 2006-07-13 12:28
#68090 #68090
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Zusätzlich kannst du anstatt "\d" auch eine Regex nehmen die genau dem Zahlenbereich entspricht. Ein Monat hat nie mehr als "31" Tage, sowie ein jahr nie mehr als 12 Monate hat. (Hab die Regexe jetzt nicht getestet) Du wirst zwar immer noch "31.2" finden, aber den rest musst du dann in deinem Programm prüfen. Der Vorteil ist hier nur das deine Auswahl genauer ist, und du sehr viele mögliche IP Addressen damit zusätzlich auch noch ausfilterst. Oder du machst das Überprüfen generell in deinem Programm und benutzt weiterhin einfach nur "\d". Und wenn du es richtig machst, müsstest du auch noch auf Schaltjahr überprüfen. ...

Für Tag:
[012]?[1-9]|[123][01]

Für Monat:
0?[1-9]|1[012]

Für die Übersicht kannst du das ganze auch in einer Variablen zwischenspeichern und dann in deiner Zielregex einfügen.

Code: (dl )
1
2
3
4
my $day   = qr/[012]?[1-9]|[123][01]/;
my $month = qr/[1-9]|1[012]/;

if ( m/$day\.$month\.\d{4}/o ) .......

In diesem Fall noch ein /o benutzen, damit deine Regex nicht ständig neu Kompiliert wird, weiß aber gar nicht mehr ob dies auch der Fall ist, wenn man eine kompilierte Regex einfügt. Naja egal, falsch ist es in diesem Fall nicht. Auser du musst eine variable einfügen, die variabel ist.

Und anstatt Lockbehind kannst du auch ein Lockahead benutzen, dass kann Variabel sein, und ist sogar schneller. Lockbehind sollte man wenn es geht gar nicht benutzen, und wenn nur bei Literalen Texten.

Es ist so gesehen identisch ob du nun sagst: Vor "Hallo" darf kein "A" stehen, oder ob du sagst, such mir eine Position wo kein "A" ist, und dort meine Regex matcht.

EDIT:
So, zumindest etwas getestet. Vor und nach einem Datum muss immer ein Whitespace Zeichen stehen.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
use strict;
use warnings;

my $text = "Heute ist der 31.1.2006 und meine IP 123.123.123.123 aber nicht 10.0.0.10 jedoch 31.02.2205 32.1.2207 31.13.2006 1.1.11 0.0.00 55.55.55\n";

my $datum = qr/
(?=\s)\s
(
(?: [012]?[1-9] | [123][01] ) \.
(?: 0?[1-9] | 1[012] ) \.
(?: \d{2,4} )
)
(?=\s)
/x;

if ( my @results = $text =~ m/$datum/g ) {
print "$_\n" for @results;
}


Ausgabe:
Code: (dl )
1
2
3
31.1.2006
31.02.2205
1.1.11
\n\n

<!--EDIT|sid burn|1152783955-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de

View full thread RegEx: Daten im Format TT?.MM?.'?JJ: aber keine IP-Adressen