Schrift
[thread]8163[/thread]

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

Leser: 1


<< >> 9 Einträge, 1 Seite
pktm
 2006-07-12 22:55
#68084 #68084
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!

Ich versuche zur Zeit eine RegEx zu erstellen, die mir alle möglichen Daten aus einem Text filtert.
Soweit bin ich mittlerweile gekommen:
Code: (dl )
(?:\d\d?\.\s?\d\d?\.\s?\'?\d\d\D)

Wie man erkennt habe ich mich erstmal auf Daten im Format TT?.MM?.'?JJ beschränkt.

Jetzt habe ich das Problem, dass auch IP-Adressen gefiltert werden. Ich bekomme es jedoch nicht hin, am Ende der RegEx bei \D noch eine Klausel einzufügen, dass das nächste Zeichen kein Punkt sein darf - die RegEx dort ansonsten kein Ergebnis ausspucken soll.

Kann mir da wer helfen? Ich habe es mal mit [^\.] versucht, aber dann erhalte ich die IP-Adresse trotzdem, nur halt ohne Punkt.

Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
betterworld
 2006-07-12 23:22
#68085 #68085
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Kannst ja am Ende noch ein (?![0-9.]) dranhängen. Und am Anfang entsprechend ein (?<![0-9.])\n\n

<!--EDIT|betterworld|1152732223-->
topeg
 2006-07-12 23:40
#68086 #68086
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Ist ungetestet, aber versuch mal das:
Code: (dl )
(?<!\d{1,3}\.\s*)\d{1,2}\.\s*\d{1,2}\.\s*'?\d{2,4}(?!\.\s*\d{1,3})

Ich frage zusätzlich ab, ob vor dem gefunden string kein Punkt steht und ob nach dem gefundenen String kein Punkt ist.

Die "{,}"klammern bestimmen wie häufig ein dovor stehender Wert minimal und maximal gefunden werden dürfen.
pktm
 2006-07-13 00:18
#68087 #68087
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Ah - Danke!
Das ?! kannte ich noch nicht.
Habe es jetzt sogar in der Doku gefunden. Diese ganzen kryptischen Zeichen bringen mich leicht aus dem Konzept... :D

@topeg: Das mit dem lookbehind klappt nicht. In der Doku steht dazu:
Quote
Works only for fixed-width look-behind.

Das trifft sich mit meinem Fehler, den ich bekomme:
Quote
Variable length lookbehind not implemented in regex; marked by <-- HERE in m/
(
(?:
(?<!\d{1,3}\.\s*)
\d{1,2}\.\s*\d{1,2}\.\s*'?\d{2,4}
(?!\.\s*\d{1,3})
)
|
(?:\d\d\d\d\-\d\d?\-\d\d?)
)
<-- HERE / at[...]


Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
betterworld
 2006-07-13 00:43
#68088 #68088
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Tja, aber in meinem Vorschlag war kein variable length negative look-behind.
pktm
 2006-07-13 01:37
#68089 #68089
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
[quote=betterworld,12.07.2006, 22:43]Tja, aber in meinem Vorschlag war kein variable length negative look-behind.[/quote]
Jepp!
http://www.intergastro-service.de (mein erstes CMS :) )
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
renee
 2006-07-13 19:49
#68091 #68091
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich würde nicht Whitespaces nehmen, sondern Wortgrenzen (\b)...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
sid burn
 2006-07-14 00:42
#68092 #68092
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
[quote=renee,13.July.2006, 17:49]Ich würde nicht Whitespaces nehmen, sondern Wortgrenzen (\b)...[/quote]
Die Matchen aber auf einen Punkt. Beziehungsweise wird ein Punkt als Wortgrenze angesehen.

Code: (dl )
1
2
3
4
my $text = "hallo 10.10.10.10 Welt!";
if ( $text =~ /\b(\d+\.\d+\.\d+)\b/ ) {
print $1;
}


Gibt dann:
Code: (dl )
10.10.10


Deswegen habe ich Whitespace genommen, am anfang hatte ich das auch mit Woortgrenzen implementiert.\n\n

<!--EDIT|sid burn|1152823573-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
<< >> 9 Einträge, 1 Seite



View all threads created 2006-07-12 22:55.