Regular Expression/Listen
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).
|
- | 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.
|
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.