Re: Reguläre Ausdrück e nachschlagen?
David Haller <[email protected]>
| Newsgroups | gmane.linux.suse.programming |
|---|---|
| Message-ID | <[email protected]> |
Hallo, Am Thu, 08 Sep 2005, Manfred Rebentisch schrieb: >Am Donnerstag, 8. September 2005 00:22 schrieb David Haller: >> Am Wed, 07 Sep 2005, Manfred Rebentisch schrieb: >> >Ah, also fÃŒr PHP habe ich es gefunden: >> > >> > file:/usr/share/doc/packages/phpdoc/manual/pcre.pattern.syntax.html >> >> Das "pcre" steht fuer "Perl Compatible Regular Expression(s)". Siehe dazu >> also auch 'perldoc perlre' 'perldoc perlrequick', 'perldoc perlreref' und >> 'perldoc perlretut'. >> >Gut, das sind wirklich hilfreiche und umfangreiche Dokumente. *hehe* >> Und falls du mal wie der Ochs vor'm Berg stehst, dann frag doch einfach, >> hier oder in einer passenden newsgroup wie z.B. de.comp.lang.perl.misc >> wenn du z.B. eine RE fuer ein bestimmtest Problem suchst oder eine RE >> nicht nachvollziehen kannst. >Das ist ein tolles Angebot. Gut, ich habe es inzwischen herausbekommen. Ich >wollte die PCRE-Syntax: > > "#\[email\]([a-z0-9&\-_.]+?@[\w\-]+\.([\w\-\.]+\.)?[\w]+)\[/email\]#si" > >die in PHP z.B. mit preg_replace benutzt wird, verwenden fÃŒr GNU regcomp und >regexec. Das sind keine PCRE-Funktionen, sondern die normalen POSIX Methoden. Vergleiche die Definition von z.B. '\w' in einer PCRE mit '[:alpha:]' in einer POSIX-RE ;) >Erkannt wird damit ein String wie "[email][email protected][/email]". > >Ich habe es mit "\[email\]([[:alnum:]@\-_\.]*)\[/email\]" versucht und es ^^^^^^^ >funktioniert auch - aber es ist nicht das gleiche. >Ich dachte, es sei richtig, die Syntax so umzustellen (nachdem ich >die Doku gelesen hatte und wuÃte, daà "\w" Wortzeichen sind): > > "\[email\]([a-z0-9&\-_.]+?@[[:alnum:]\-]+\.([[:alnum:]\-\.]+\.)? ^^ Achtung! Das ist in beiden Faellen (auch in perl) faslch. So geschrieben ist das "alnum" + '\' + '-' + '\' + '.'. Korrekt waere: PCRE: [\w.-] POSIX: [[:alpha:].-] Man beachte, dass der '-' nur als erstes oder letztes Zeichen seine Sonderbedeutung verliert -- der '\' jedoch, genau wie der '.' per se in einer Zeichenklasse (-> "[]") keine Sonderbedeutung hat. Sowas kann zu evtl. unerwuenschten Nebeneffekten fuehren... >[[:alpha:]]+)\[/email\]" > >und siehe da, jetzt funktioniert es. Dein: \[email\]([a-z0-9&\-_.]+?@[\w\-]+\.([\w\-\.]+\.)?[\w]+)\[/email\] ist in POSIX-ERE (siehe man 7 regex) also (ungetestet): \[email\]([a-z0-9&_.-]+?@[[:alpha:]-]+\.([[:alpha:].-]+\.)?[[:alpha:]]+)\[/email\] Wobei mir gerade auffaellt, dass die RE eigentlich nicht korrekt fuer Email-Adressen ist (aber "gut genug" fuer viele Faelle ;). >Auch mit der Syntax > > "#\[url\]([\w]+?://[^ \"\n\r\t<]*?)\[/url\]#is" >umgestellt zu > "\[url\]([[:alpha:]]+?://[^\"[:space:]<]*?)\[/url\]" >hatte ich Probleme, bis ich darauf kam, "[[:alpha:]]" statt "[:alpha:]" >einzusetzen (um z.B. "[url]http://www.domain.tld[/url]" zu erkennen). Du kannst die POSIX-Klassen ([:alpha:] etc. nur genauso(!) wie einen einzelnen Buchstaben innerhalb einer []-Gruppe verwenden. Das steht so auch in 'man 7 regex' (und anderswo), aber eben eher implizit... ==== man 7 regex ==== [..] A bracket expression is a list of characters enclosed in `[]'. [..] Within a bracket expression, the name of a character class enclosed in `[:' and `:]' stands for the list of all char acters belonging to that class. ==== Entscheidend sind die Woerter "Within" und "enclosed". *INNERHALB* eines []-Ausdrucks koennen benannte Zeichenklassen stehen, wobei der *Name* der Zeichenklasse wiederum von "[:" und ":]" *umschlossen* sein muss! Bsp: die Klasse "xdigit" hat _umschlossen_ von "[:" und ":]" ==> "[:xdigit:]" *innerhalb* einer "Bracket-Expression" "[]" zu stehen, also ==> "[[:xdigit:]]"... Liest man die manpage also sorgfaeltig genug kommt man dahinter ;) Ob es eine Uebersetzung von regex(7) gibt und wie gut diese ist weiss ich nicht. Da ich gut genug englisch kann lese ich nur englische manpages. Die Uebersetzungen sind oft - veraltet - schlecht/irrefuehrend uebersetzt - lueckenhaft oder alles zusammen. Wer englisch auch nur halbwegs lesen kann sollte die englischen manpages zumindest _AUCH_ mal lesen/anschauen... Man vergleich z.B. 'man -L de ls' mit 'man -L en ls'... -dnh -- Nature, and Nature's laws lay hid in night God said, Let Newton be! and all was light. -- Alexander Pope It did not last: the Devil howling "Ho! Let Einstein be!", restored the status quo. -- J. C. Squire -- Um die Liste abzubestellen, schicken Sie eine Mail an: [email protected] Um eine Liste aller verfÃŒgbaren Kommandos zu bekommen, schicken Sie eine Mail an: [email protected]