Login
Newsletter
Werbung

Mi, 25. Januar 2006, 00:00

Mailfilter - Ein Anti-Spam Utility

Reguläre Ausdrücke

Was sind reguläre Ausdrücke

Reguläre Ausdrücke, kurz REs, sind Muster bzw. codierte Beschreibungen für den Aufbau von Zeichenketten (Strings). Es ist eine Art Verallgemeinerung, mit der man eine Untermenge von einem oder mehreren Strings erfassen kann. Sie sind somit ideal zum Suchen und Ersetzen innerhalb von Texten geeignet.

Aufbau von regulären Ausdrücken

Gekürzte Fassung der Manpage ("man 7 regex"):

Moderne REs (entspricht Variante "extended")

Eine moderne RE ist ein oder mehrere Zweige, die durch ein | getrennt sind. Sie trifft zu, wenn einer der Zweige zutrifft (inklusives ODER).

Ein Zweig ist ein oder mehr aneinander gehängte Teile. Er trifft zu, wenn der erste Teil zutrifft, gefolgt vom zweiten, usw.

Ein Teil ist ein Atom, evtl. gefolgt von einem einfachen '*', '+', '?' oder einer Beschränkung (bound). Ein Atom gefolgt von einem '*' trifft für eine Sequenz von 0 oder mehr dieses Atoms zu (beliebig viele). Ein Atom gefolgt von einem '+' trifft für eine Sequenz von 1 oder mehr dieses Atoms zu (beliebig viele, aber mindestens eins). Ein Atom gefolgt von einem '?' trifft für eine Sequenz von 0 oder 1 dieses Atoms zu (optional).

Eine Beschränkung ist '{' gefolgt von einer vorzeichenlosen ganzen Zahl, möglicherweise gefolgt von ',' und einer weiteren vorzeichenlosen ganzen Zahl, immer gefolgt von '}'. Die ganze Zahl muss zwischen 0 und 255 (RE_DUP_MAX) inklusive liegen und wenn zwei Zahlen vorhanden sind, darf die erste nicht größer als die zweite Zahl sein.

Eine Beschränkung mit nur einer ganzen Zahl i und keinem Komma (z.B. e{8}) trifft zu, wenn das Atom genau i mal vorkommt. Eine Beschränkung mit nur einer Zahl i, gefolgt von einem Komma (z.B. a{3,}), trifft dann zu, wenn i oder mehr Atome vorkommen. Sind zwei Zahlen i und j vorhanden (z.B. p{3,7}), dann trifft dieser Teil auf eine Anzahl von i bis j dieser Atome zu.

Ein Atom ist eine in runden Klammern eingeschlossene RE (steht für die darin enthaltene RE), ein leeres Klammernpaar () (steht für einen leeren (Null-) String), ein geklammerter Ausdruck (siehe unten), . (trifft auf ein einzelnes Zeichen außer dem Newline-Zeichen zu), ^ (die leere Zeichenkette am Anfang der Zeile), $ (die leere Zeichenkette am Ende der Zeile), ein \ gefolgt von einem der Sonderzeichen ^.[$()|*+?{\ (trifft auf das nachfolgende Zeichen zu (Sonderbedeutung wird ausgeschaltet, als wäre das \ nicht vorhanden), oder ein einfaches Zeichen ohne jedwede Sonderbedeutung (trifft auf sich selbst zu). Ein {, gefolgt von einem anderen Zeichen als einer Zahl wird wie ein normales { und nicht wie eine Beschränkung behandelt. Es ist nicht erlaubt, REs mit \ zu beenden.

Ein geklammerter Ausdruck ist eine Liste von Zeichen, die von eckigen Klammern [] eingeschlossen werden. Normalerweise trifft so ein Ausdruck auf jedes einzelne der enhaltenen Zeichen zu, aber nicht der Rest der Liste. Wenn zwei der Zeichen durch ein - getrennt sind, ist das die Abkürzung für den vollen Zeichenbereich zwischen diesen beiden Zeichen (inklusive), z.B. trifft [0-9] in ASCII auf eine Ziffer zu. Es ist nicht erlaubt, zwei Bereiche mit gleichem Endpunkt zu verbinden (z.B. [a-c-e]). Solche Bereiche sind sehr stark abhängig von der Sortierreihenfolge, sprich der verwendeten Codetabelle. Bei deren Verwendung kann die Portabilität stark leiden. Für Mailfilter im konkreten bedeutet das teilweise unverhersehbares Verhalten solcher Filterregeln. Siehe hierzu auch den Abschnitt Troubleshooting.

Um in solchen Ausdrücken ein ] einzubinden, muss dieses als erstes Zeichen noch vor einem möglichen ^ stehen. Um ein - in eine solche Liste zu integrieren, muss dieses am Anfang oder Ende stehen. Um das Zeichen - als Endpunkt eines Zeichenbereichs zu benutzen, muss es in [. und .] eingeschlossen sein.

Innerhalb der geklammerten Ausdrücke gibt es Zeichenklassen, die in [: und :] eingeschlossen werden und für alle Zeichen dieser Klasse stehen. Die Standardklassen sind: alnum, alpha, blank, cntrl, digit, graph, lower, print, punct, space, upper, xdigit. Alle Typen sind in der Manpage ctype(3) genauer erklärt.

Hier die wichtigsten für die Anwendung in Filterregeln:

  • "alnum" trifft auf alle Buchstaben und Ziffern zu
  • "alpha" trifft auf alle Buchstaben zu
  • "blank" trifft auf Space oder Tab zu
  • "digit" trifft auf alle Ziffern zu
  • "lower" trifft auf alle Kleinbuchstaben zu
  • "upper" trifft auf alle Großbuchstaben zu

Auch Zeilenanfang und -ende können in geklammerten Ausdrücken ausgedrückt werden: [[:<:]] steht für den Anfang einer Zeile und [[:>:]] für das Zeilenende.

Veraltete REs (entspricht Variante »basic«)

Da es sich hierbei um Dinge handelt, die als »obsolete« (veraltet) eingestuft sind, nur so viel: Diese Art von REs sind in ihrem Funktionsumfang stark eingeschränkt und teilweise sogar komplizierter zu handhaben. Genaueres erfahren Sie aus der Manpage (man 7 regex).

Kommentare (Insgesamt: 0 )
Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten
Werbung