Diskussion:Regular Expression
Regular Expressions
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 "A" noch ein kleines "a" sind
Kurzes Beispiel: "[Aa]lpha" findet alle Textstücke "Alpha" und "alpha"
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. 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 | Beispiel |
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
Darüber hinaus gibt es einige vordefinierte Listen:
[:alnum:] | alle Ziffern und Buchstaben |
[:alpha:] | alle Buchstaben |
[:cntrl:] | alle Kontrollzeichen |
[:digit:] | alle Ziffern |
[:lower:] | alle Kleinbuchstaben |
[:punct:] | alle Satzzeichen |
[:blank:] | Leerzeichen |
[:space:] | Zeichen die Leerraum erzeugen (Leerzeichen, Zeilenvorschub, ...) |
[:upper:] | alle Großbuchstaben |
Besondere Zeichen
Der Punkt "." passt auf ein beliebiges Zeichen Das Caret "^" findet den Anfang einer Zeile Das Dollarzeichen "$" findet das Ende einer Zeile Die Symbole "\<" passen auf den Beginn eines Wortes Die Symbole "\>" passen auf das Ende eines WortesWiederholungsoperatoren
Reguläre Ausdrücke können mit Hilfe dieser Operatoren öfter wiederholt werden
"?" Der vorangegangene Ausdruck ist Optional und wird maximal einmal angetroffen "*" Der vorangegangene Ausdruck wird beliebig oft (auch keinmal) vorgefunden "+" Der vorangegangene Ausdruck wird mindestens einmal gefunden "{n}" Der vorangegangene Ausdruck wird genau n-mal gefunden "{n,}" Der vorangegangene Ausdruck wird mindestens n-mal oder öfter angetroffen "{n,m}" Der vorangegangene Ausdruck wird mindesten n-mal und maximal m-mal angetroffenZusammenführung von regulären Ausdrücken
Mehrere reguläre Ausdrücke können durch Aneinanderfügen zusammengeführt werden. Ein solcher Ausdruck findet dann alle Zeichenketten, die aneinander gehängt zu dem jeweiligen Ausdruck passen. Das obige Beispiel "[Aa]lpha" stellt eine solche Verkettung dar. Es ist aus den Einzelnen Bausteinen "[Aa]", "l", "p", "h" und "a" aufgebaut
Verknüpfung durch "oder"
Durch den Operator "|" lassen sich reguläre Ausdrücke mit einem "oder" verknüpfen. Der daraus entstehende Ausdruck findet Zeichenketten, die entweder auf den einen oder den anderen Ausdruck passen
Kurzes Beispiel: "[Aa]lpha|[Bb]ravo" findet alle Textstücke "Alpha", "alpha", "Bravo" und "bravo" (am Besten nur mit Parameter -E oder egrep)
Vorrang der Regeln
Ähnlich wie bei mathematischen Ausdrücken (Punkt- vor Strichrechnung) unterliegen die Verknüpfungsoperatoren einer gewissen Rangfolge: Wiederholungen kommen vor Verkettungen, die wiederum vor dem "oder" kommen. Wie auch in arithmetischen Ausdrücken lassen sich diese Regeln durch Klammern überschreiben
Geklammerte Ausdrücke referenzieren
Eine Teilzeichenkette, die auf einen geklammerten Teilausdruck gepasst hat, lässt sich durch "\n" referenzieren. Dabei steht "n" für eine einzelne Ziffer, die den n-ten geklammerten Teilausdruck auswählt
Beispiele:
- "\<[Aa]+n+[ae]+\>" findet alle Wörter, die ungefähr wie Anne oder Anna aussehen, nur mit beliebig vielen "A", "n" und "e" (sofern sie jeweils mindestens ein mal vorkommen). AAnnneeea würde zum Beispiel auch passen
- "[Ss]up(er|ra)" findet alle Wörter, die ein Super, super, Supra oder supra enthalten
- "^digit:" findet alle Zeilen, die mit einer Ziffer beginnen
Reguläre Ausdrücke
Ein regulärer Ausdruck (engl. regular expression, Abk. RegExp oder Regular expression) eine Zeichenkette, die der Beschreibung von Mengen beziehungsweise Untermengen von Zeichenketten mit Hilfe bestimmter syntaktischer Regeln dient
Funktion | |
^ | Beginn der Zeile |
$ | Ende der Zeile |
. | Genau ein beliebiges Zeichen |
* | Beliebig viele des vorangegangenen Zeichens |
[:zeichenklasse:] | Ein Zeichen aus dem Bereich. Anstelle von Zeichen können vordefinierte Klassen von Zeichen verwendet werden: [:alnum:], [:alpha:], [:cntrl:], [:digit:], [:graph:], [:lower:], [:print:], [:punct:], [:space:], [:upper:], und [:xdigit:] |
[^] | Kein Zeichen aus dem Bereich |
\< | Muster am Wortanfang suchen |
\> | Muster am Wortende suchen |
\(..\) | Eingeschlossenes Muster vormerken; auf dieses kann später über \1 zugegriffen werden. Bis zu neun Muster können auf diese Weise gespeichert werden |
x\{m\} | m-faches Auftreten des Zeichens x |
x\{m,n\} | mindestens m-, maximal n-maliges Auftreten des Zeichens x |
+ | Mindestens ein Auftreten des vorangegangenen Zeichens |
? | Höchstens ein Auftreten des vorangegangenen Zeichens |
x|y | Zeichen "x" oder Zeichen "y" |
(abc|xyz) | Zeichenkette "abc" oder Zeichenkette "xyz". Die runden Klammern können entfallen |