Hallo, ich frage mich gerade, wo ich die Syntax für reguläre Ausdrücke nachschlagen kann. Ich habe nichts ausführliches gefunden ("man 7 regex" ist ja schon ganz ok). Bei PHP gibt es zum Beispiel sowas wie "\w", aber beim umsetzen nach GNU-C finde ich nirgends eine Erklärung was mit "\w" bewirkt wird. Aber wahrscheinlich habe ich nur nicht an der richtigen Stelle gesucht... *schnief*. Danke für einen Tip Manfred
On Wednesday 07 September 2005 17:30, Manfred Rebentisch wrote:
ich frage mich gerade, wo ich die Syntax für reguläre Ausdrücke nachschlagen kann.
man 7 regex info regcomp
Ich habe nichts ausführliches gefunden ("man 7 regex" ist ja schon ganz ok). Bei PHP gibt es zum Beispiel sowas wie "\w", aber beim umsetzen nach GNU-C finde ich nirgends eine Erklärung was mit "\w" bewirkt wird. Aber wahrscheinlich habe ich nur nicht an der richtigen Stelle gesucht... *schnief*.
Laut der Doku kann man bei regcomp angeben, ob man erweiterte oder einfache
reguläre Ausdrücke haben will.
Wortgrenzen kann man laut "man 7 regex" mit "[[:<:]]" und "[[:>:]]" angeben.
Das ist nicht exakt das gleiche wie \w bzw. \W, aber es geht denke ich in
diese Richtung.
CU
--
Stefan Hundhammer
Hallo Stefan, vielen Dank für Deine Antwort. Am Mittwoch, 7. September 2005 17:39 schrieb Stefan Hundhammer:
On Wednesday 07 September 2005 17:30, Manfred Rebentisch wrote:
ich frage mich gerade, wo ich die Syntax für reguläre Ausdrücke nachschlagen kann.
man 7 regex Las ich schon.
info regcomp Ist recht mager, mal angeschaut oder nur auf Verdacht getippt?
Ich habe nichts ausführliches gefunden ("man 7 regex" ist ja schon ganz ok). Bei PHP gibt es zum Beispiel sowas wie "\w", aber beim umsetzen nach GNU-C finde ich nirgends eine Erklärung was mit "\w" bewirkt wird. Aber wahrscheinlich habe ich nur nicht an der richtigen Stelle gesucht... *schnief*.
Laut der Doku kann man bei regcomp angeben, ob man erweiterte oder einfache reguläre Ausdrücke haben will.
Das weiß ich ja...
Wortgrenzen kann man laut "man 7 regex" mit "[[:<:]]" und "[[:>:]]" angeben. Das ist nicht exakt das gleiche wie \w bzw. \W, aber es geht denke ich in diese Richtung.
...und fein: weißt Du nun, wo die Doku dazu steht? Die "Richtung" reicht mir nicht! Manfred
Hallo, Am Mittwoch 07 September 2005 17:30 schrieb Manfred Rebentisch:
Hallo, ich frage mich gerade, wo ich die Syntax für reguläre Ausdrücke nachschlagen kann. Ich habe nichts ausführliches gefunden ("man 7 regex" ist ja schon ganz ok). Bei PHP gibt es zum Beispiel sowas wie "\w", aber beim umsetzen nach GNU-C finde ich nirgends eine Erklärung was mit "\w" bewirkt wird. Aber wahrscheinlich habe ich nur nicht an der richtigen Stelle gesucht... *schnief*.
Wenn du Perl Regexe in PHP benutzt, geht "man perlre". Es gibt aber bei PHP IIRC einige kleinere Unterschiede. Ferdinand
Am Mittwoch, 7. September 2005 18:29 schrieb Ferdinand Ihringer:
Hallo,
Am Mittwoch 07 September 2005 17:30 schrieb Manfred Rebentisch:
Hallo, ich frage mich gerade, wo ich die Syntax für reguläre Ausdrücke nachschlagen kann. Ich habe nichts ausführliches gefunden ("man 7 regex" ist ja schon ganz ok). Bei PHP gibt es zum Beispiel sowas wie "\w", aber beim umsetzen nach GNU-C finde ich nirgends eine Erklärung was mit "\w" bewirkt wird. Aber wahrscheinlich habe ich nur nicht an der richtigen Stelle gesucht... *schnief*.
Wenn du Perl Regexe in PHP benutzt, geht "man perlre". Es gibt aber bei PHP IIRC einige kleinere Unterschiede.
Vielen Dank, es geht mir genau um die Details. Finde ich enorm wichtig. Ich wundere mich, daß ich (verdammt!) die Doku dazu nicht finde... Manfred
Ah, also für PHP habe ich es gefunden: file:/usr/share/doc/packages/phpdoc/manual/pcre.pattern.syntax.html Jetzt fehlt mir noch was vergleichbares für GNU-C-regex(). Grüße Manfred
Hallo, 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'. Ausserdem 'man 3 pcre' (Doku der libpcre) und 'man 7 pcre'.
Jetzt fehlt mir noch was vergleichbares für GNU-C-regex().
Da ist 'man 3 regex', 'man 7 regex', sowie die restlichen Manpages dazu (regcomp, regerror, regexec, regfree). Ansonsten: systematisch(!) ausprobieren hilft dem Verstehen. Ich habe zumindest mit 'man 7 regex' und 'perldoc perlre' eigentlich alles noetige beisammen. 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. -dnh -- Kurz gefasst: /etc/crontab ist IMHO so nützlich wie eine Laus in einem Raumanzug - es juckt, aber Du kannst Dich nicht kratzen, es sei denn, Du bist Gott auf Deinem System. Und dann weisst Du noch nicht mal, ob Du anstelle der Laus Deine Nase amputiert hast. -- Jan Trippler in suse-linux
Hallo David, vielen Dank für Deine nette und hilfreiche Antwort! Am Donnerstag, 8. September 2005 00:22 schrieb David Haller:
Hallo,
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.
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. Erkannt wird damit ein String wie "[email]user@domain.tld[/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:]\-\.]+\.)? [[:alpha:]]+)\[/email\]" und siehe da, jetzt funktioniert es. 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). Grüße Manfred
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]user@domain.tld[/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
participants (4)
-
David Haller
-
Ferdinand Ihringer
-
Manfred Rebentisch
-
Stefan Hundhammer