Regular Expression/Listen

Aus Foxwiki

Listen

Listen (bracket expressions)

Erwartet man an einer Stelle innerhalb des Regulären Ausdrucks nicht ein ganz bestimmtes Zeichen, sondern nur eines aus einer spezifischen Liste, so kann man dies durch eine sogenannte bracket expression ausdrücken.

Die Liste der Zeichen, aus der das zu findende Zeichen stammen soll, wird dazu einfach in eckigen Klammern "[]" angegeben. Um beispielsweise alle Buchstaben "a", egal ob groß oder klein, zu finden, verwendet man folgenden regulären Ausdruck: "[Aa]"

Möchte man alle Zeichen finden, die nicht in der Liste stehen, die Liste also negieren, so muss das erste Zeichen in der Liste ein Caret "^" sein. Ein regulärer Ausdruck der Form "[^Aa]" passt also auf alle Zeichen, die weder ein großes noch ein kleines "a" sind.

Beispiel
[Aa]lpha* findet alle Textstücke "Alpha" und "alpha".

Range Expression

Um die Listen der bracket extensions kompakt darstellen zu können, werden range expressions verwendet. Ein range expression wird durch zwei Zeichen, die durch einen Bindestrich miteinander verbunden sind, dargestellt:

[a-d]

Ein solcher Ausdruck passt auf alle Zeichen, die in der Sortierung des Zeichensatzes zwischen die beiden Zeichen fallen.

Auswahl einzelner Zeichen

Zeichenauswahl ([ und ])

  • Der Ausdruck in eckigen Klammern steht dann für genau ein Zeichen aus dieser Auswahl.
  • Innerhalb dieser Zeichenklassendefinitionen haben einige Symbole andere Bedeutungen als im normalen Kontext.

Zeichenklassen (Character Classes)

Eine Character Class definiert einen Zeichenvorrat. Sie besteht aus einer Menge von ein oder mehreren Zeichen und wird innerhalb von eckigen Klammern angegeben. Die Reihenfolge der Zeichen ist beliebig.

Beispiele
[ae]* Zeichenvorrat besteht nur aus "a" und "e"
[aeiou]* alle Vokale in Kleinbuchstaben
[aeiouAEIOU]* in Klein- und Großbuchstaben
[a-fh-k]* Buchstaben a-f und h-k
[^a]* alle Zeichen außer "a"
[^abc]* alle Zeichen außer "a", "b" oder "c" (Reihenfolge gleichgültig!)

Kontextabhängige Symbole

Teilweise ist die Bedeutung eines Symbols vom Kontext abhängig, in dem es innerhalb der Klammern auftritt.

^ * Beispielsweise bedeutet ein Zirkumflex^“ am Anfang einer Zeichenklassendefinition, dass die Zeichenklasse negiert/invertiert wird (im Sinne der Komplementbildung).
  • Steht ein Zirkumflex jedoch irgendwo sonst in der Definition, ist es literal zu verstehen.
- Ebenfalls kontextabhängig ist die Bedeutung des Bindestrich-Zeichens (-). Zudem unterscheiden sich hier die Regular expressionp-Engines (zum Beispiel POSIX und PCRE) in einigen Punkten voneinander. * Steht - zwischen zwei Zeichen in der Klassendefinition, zum Beispiel „[a-g]“, so ist es als Beschreibung eines Zeichenintervalls oder Zeichenbereichs bezüglich der ASCII-Tabelle zu verstehen.
  • Das genannte Beispiel wäre äquivalent zu „[abcdefg]“. Am Anfang oder Ende einer Zeichenklasse stehende Bindestriche werden literal interpretiert.

Beispiel

„[^ ]$“ * Zeichenkette muss aus mind. einem Zeichen bestehen und

das letzte Zeichen darf kein Leerzeichen sein

Sortierung

Leider hängt diese Sortierung von der verwendeten locale-Einstellung ab. In der Standard C locale würde obiges Muster "[a-d]" einem regulären Ausdruck von "[abcd]" entsprechen, während er bei vielen anderen locales einem Ausdruck "[aBbCcDd]" entsprechen würde.

Um die C locale für die Zeichensortierung zu erzwingen, kann man der Variablen LC_CTYPE den Wert C zuweisen:

LC_CTYPE=C befehl* gilt nur für diesen Befehl
LC_CTYPE=C grep -E [a-d] Datei
export LC_CTYPE=C* gilt für alle nachfolgenden Befehle

Die meisten Zeichen mit besonderer Bedeutung verlieren diese Bedeutung innerhalb eines bracket expressions. Um ein Zeichen "]" in die Liste aufzunehmen, muss es an der ersten Stelle in der Liste stehen.

Um das Caret "^" in die Liste aufzunehmen, kann es irgendwo in der Liste stehen, nur nicht an der ersten Stelle. Um den Bindestrich "-" in die Liste einzufügen, muss es an letzter Stelle stehen.