FB18 - Das Forum für Informatik

fb18.de / Off-Topic / Hard- und Softwarefragen

Perl "regulaere Ausdruecke"

Perl "regulaere Ausdruecke" 2003-07-28 21:43
UncleOwen
Ich versuch gerade mal (wieder), mein Perl ein wenig aufzufrischen:

my @lines = ($content=~m/\<table[^\>]*\>([^\<]*)\<\/table\>/g);

In $content steht eine komplette HTML-Datei (ohne Zeilenumbrueche und ohne verschachtelte Tabellen).

Danach sollte doch in @lines der Inhalt saemtlicher table-Tags stehen, oder? Tuts aber nicht… @lines ist leer. Sieht jemand, was da falschlaeuft?

PS: Ja, ich weiss, dass es HTML::Parser gibt… aber ist ja eh (mehr oder weniger) nur zur Uebung.

Re: Perl "regulaere Ausdruecke" 2003-07-28 22:08
UncleOwen
Baeh, Fehler gefunden…

Re: Perl "regulaere Ausdruecke" 2003-07-28 22:15
UncleOwen
Jop, das wars: Dank dem ([^\<]*) haette zwischen <table> und </table> kein anderes Tag sein duerfen - was bei meiner HTML-Datei natuerlich nicht der Fall war.

(.*?) funktioniert stattdessen. ? sorgt dafuer, dass dass der * "ungreedy" ist, also nicht das erste <table> mit dem letzten </table> zusammen gematched wird.

Danke an die 3 Leute, die sich mein Posting angeguckt haben [img]http://www.fb18.de/gfx/10.gif[/img]

Re: Perl "regulaere Ausdruecke" 2003-07-28 22:25
Slater
Danke an die 3 Leute, die sich mein Posting angeguckt haben [img]http://www.fb18.de/gfx/10.gif[/img]
ich wusste dass das helfen würde!


Re: Perl "regulaere Ausdruecke" 2003-07-29 16:30
leif
Daß Dir geschachtelte Tabellen das Genick brechen, wird Dir sicherlich klar sein.

Warum setzt Du eigentlich immer ein Backslash vor < und >?
Eigentlich sollten das in Regulären Ausdrücken doch keine Sonderzeichen sein, oder? Oder ist das nur Gewohnheit von der Shell?

Re: Perl "regulaere Ausdruecke" 2003-07-29 16:47
UncleOwen
Daß Dir geschachtelte Tabellen das Genick brechen, wird Dir sicherlich klar sein.

Jo, ist aber bei der Seite, um die es geht (Programmuebersicht von tvtoday.de) nicht der Fall

Warum setzt Du eigentlich immer ein Backslash vor < und >?

Ich kann mir nie merken, welche Sonderzeichen jetzt 'ne spezielle Bedeutung haben, also escape ich sie halt alle. Noetig isses nur bei *nachschlag* . + * ? ^ $ ( ) [ ] { } | \

richtig?
<edit>Aber hast Recht, ohne sieht es in diesem Fall VIEL uebersichtlicher aus…</edit>

Re: Perl "regulaere Ausdruecke" 2003-07-29 18:03
leif
Ich kann mir nie merken, welche Sonderzeichen jetzt 'ne spezielle Bedeutung haben, also escape ich sie halt alle. Noetig isses nur bei *nachschlag* . + * ? ^ $ ( ) [ ] { } | \

richtig?
Fast. Es kommt noch das Zeichen dazu, daß die RE begrenzt. In Deinem Fall also '/'.

Du könntest übrigens auch noch das 'm' vor dem '/' weglassen, oder aber ein anderes Zeichen als '/' als Begrenzer nehmen und damüßtest dann das '/' intern nicht escapen:
$content =~ /<table[^>]*>(.*?)<\/table>/goder
$content =~ m#<table[^>]*>(.*?)</table>#g
und noch zwei Zeichen kürzer (und für mich lesbarer) wird es so:
$content =~ m#<table.*?>(.*?)</table>#g

Re: Perl "regulaere Ausdruecke" 2003-07-29 18:19
UncleOwen
schoen, gefaellt mir [img]http://www.fb18.de/gfx/14.gif[/img]

Re: Perl "regulaere Ausdruecke" 2003-07-29 18:29
M
Ich kann mir nie merken, welche Sonderzeichen jetzt 'ne spezielle Bedeutung haben, also escape ich sie halt alle. Noetig isses nur bei *nachschlag* . + * ? ^ $ ( ) [ ] { } | \

richtig?
Fast. Es kommt noch das Zeichen dazu, daß die RE begrenzt. In Deinem Fall also '/'.
Und natürlich '\' [img]http://www.fb18.de/gfx/28.gif[/img]

Re: Perl "regulaere Ausdruecke" 2003-07-29 18:37
M
Wie wär's mit der dynamischen Variante:
my $pat = '<table[^>]*>(.*?)</table'; $content =~ /$pat/g;

Re: Perl "regulaere Ausdruecke" 2003-07-29 18:41
tekai
Warum setzt Du eigentlich immer ein Backslash vor < und >?
Eigentlich sollten das in Regulären Ausdrücken doch keine Sonderzeichen sein, oder? Oder ist das nur Gewohnheit von der Shell?
In einigen implementationen (aber nicht Perl) sind \< \> "word boundaries", insofern ist es dehalb ratsam nicht zuviel zu "escapen".



Re: Perl "regulaere Ausdruecke" 2003-07-29 19:05
M
Das betrifft eher grep.
In perl enthalten alle Metazeichen, die mit einem backslash beginnen nur alphanumerische Zeichen (zumindest bisher).

Re: Perl "regulaere Ausdruecke" 2003-07-29 19:47
leif
Ich kann mir nie merken, welche Sonderzeichen jetzt 'ne spezielle Bedeutung haben, also escape ich sie halt alle. Noetig isses nur bei *nachschlag* . + * ? ^ $ ( ) [ ] { } | \

richtig?
Fast. Es kommt noch das Zeichen dazu, daß die RE begrenzt. In Deinem Fall also '/'.
Und natürlich '\' [img]http://www.fb18.de/gfx/28.gif[/img]

Steht da doch schon.

Wie wär's mit der dynamischen Variante:
my $pat = '<table[^>]*>(.*?)</table'; $content =~ /$pat/g;

Welchen Vorteil hat das?


Edit: Ich schaue mal wieder ganz am Ende der 'postfreudigsten User' vorbei.

Re: Perl "regulaere Ausdruecke" 2003-07-29 20:50
M
Steht da doch schon.
oops

Wie wär's mit der dynamischen Variante:
my $pat = '<table[^>]*>(.*?)</table'; $content =~ /$pat/g;
Welchen Vorteil hat das?

Das ist z.B. notwendig, wenn man den Suchausdruck erst aus einer anderen Ausgabe extrahiert.
In diesem Fall ist es natürlich ziemlich überflüssig (obwohl man sich darüber streiten kann, ob es besser lesbarist).