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]
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.