regex(7)

BEZEICHNUNG
regex - Reguläre Ausdrücke gemäß POSIX.2

BESCHREIBUNG
Reguläre Ausdrücke (»RA«), wie sie in POSIX.2 definiert sind, gibt es in zwei Arten: moderne RA (ungefähr die von egrep(1); POSIX.2 nennt sie »erweiterte« RA) und veraltete RA (ungefähr die von ed(1); gemäß POSIX.2 »einfache« RA). Veraltete RA existieren hauptsächlich zur Rückwärtskompatibilität in einigen alten Programmen; sie werden am Ende beschrieben. POSIX.2 lässt einige Aspekte der RA-Syntax und -Semantik offen; »†« markiert Entscheidungen zu diesen Aspekten, die nicht vollständig portabel zu anderen POSIX.2-Implementierungen sein können.

Ein (moderner) RA sind einer† oder mehrere† Zweige, getrennt durch »|«. Er stimmt mit allem überein, das mit einem der Zweige übereinstimmt.

Ein Zweig sind eine† oder mehrere aneinandergehängte Stücke. Die Übereinstimmung erfolgt für das erste, gefolgt von der Übereinstimmung für das zweite und so weiter.

Ein Stück ist ein Atom, möglicherweise gefolgt von einem einzelnen† »*«, »+«, »?« oder einer Beschränkung. Ein Atom, auf das ein »*« folgt, stimmt mit einer Sequenz von 0 oder mehr Übereinstimmungen mit diesem Atom überein. Ein Atom, auf das ein »+« folgt, stimmt mit einer Sequenz von 1 oder mehr Übereinstimmungen mit diesem Atom überein. Ein Atom, auf das ein »?« folgt, stimmt mit einer Sequenz von 0 oder 1 Übereinstimmungen mit diesem Atom überein.

Eine Beschränkung ist »{« gefolgt von einer vorzeichenlosen Ganzzahl in Dezimaldarstellung, möglicherweise gefolgt von »,«, möglicherweise gefolgt von einer weiteren vorzeichenlosen Ganzzahl in Dezimaldarstellung, immer gefolgt von »}«. Die ganzen Zahlen müssen zwischen 0 und RE_DUP_MAX (255†) einschließlich liegen und falls es davon zwei gibt, darf die erste nicht größer als die zweite sein. Ein Atom, auf das eine Beschränkung folgt, die eine Ganzzahl i und kein Komma enthält, stimmt auf eine Sequenz von genau i Übereinstimmungen des Atoms überein. Ein Atom, auf das eine Beschränkung folgt, die eine Ganzzahl i und ein Komma enthält, stimmt auf eine Sequenz von i oder mehr Übereinstimmungen des Atoms überein. Ein Atom, auf das eine Beschränkung folgt, die zwei Ganzzahlen i und j enthalten, stimmt auf eine Sequenz von i bis einschließlich j Übereinstimmungen des Atoms überein.

Ein Atom ist ein regulärer Ausdruck, der in »()« eingeschlossen ist (der eine Übereinstimmung mit dem regulären Ausdruck darstellt), eine leere Menge aus »()« (der mit der leeren Zeichenkette übereinstimmt)†, ein Klammerausdruck (siehe unten), ».« (das mit einem einzelnen Zeichen übereinstimmt), »^« (das mit der leeren Zeichenkette am Zeilenanfang übereinstimmt), »$« (das mit der leeren Zeichenkette am Zeilenende übereinstimmt), einem »\« gefolgt von einem der Zeichen »^.[$()|*+?{\« (das mit diesem Zeichen, das als normales Zeichen betrachtet wird, übereinstimmt), einem »\« gefolgt von einem normalen Zeichen† (das mit dem Zeichen als normales Zeichen übereinstimmt, als ob »\« nicht vorhanden wäre†) oder einem einzelnen Zeichen mit keiner weiteren Bedeutung (was mit diesem Zeichen übereinstimmt). Ein »{« gefolgt von einem Zeichen, das keine Ziffer ist, ist ein normales Zeichen, nicht der Anfang einer Beschränkung†. Es ist verboten, einen RA mit »\« abzuschließen.

Ein Klammerausdruck ist eine Liste von Zeichen, die in »[]« eingeschlossen sind. Er stimmt normalerweise mit einem einzelnen Zeichen aus der Liste überein (siehe aber nachfolgend). Falls die Liste mit einem »^« beginnt, stimmt er mit jedem einzelnen Zeichen (siehe aber nachfolgend) überein, das nicht in der Liste ist. Falls zwei Zeichen in der Liste durch ein »-« getrennt sind, ist dies eine Abkürzung für den ganzen Bereich der Zeichen zwischen diesen zwei (einschließlich) in der Sortierordnung, beispielsweise stimmt »[0-9]« in ASCII mit jeder dezimalen Ziffer überein. Es ist verboten†, dass zwei Bereiche den gleichen Endpunkt haben, beispielsweise »a-c-e«. Bereiche hängen stark von der Sortierordnung ab und portierbare Programme sollten vermeiden, davon abzuhängen.

Um ein wörtliches »]« in die Liste aufzunehmen, verwenden Sie es als erstes Zeichen (möglicherweise nach einem »^«). Um ein wörtliches »-« aufzunehmen, verwenden Sie es als erstes oder letztes Zeichen oder als zweiten Endpunkt eines Bereichs. Um ein wörtliches »-« als ersten Endpunkt eines Bereiches zu verwenden, schließen Sie es in »[.« und ».]« ein, um es zu einem Sortierordnungselement zu machen (siehe nachfolgend). Mit der Ausnahme dieser und einiger Kombinationen, die »[« verwenden (siehe nächsten Absatz), verlieren alle anderen besonderen Zeichen, einschließlich »\«, innerhalb von Klammerausdrücken ihre besondere Bedeutung.

Innerhalb eines Klammerausdrucks steht ein Sortierordnungselement (ein Zeichen, eine Mehrzeichensequenz, das so einsortiert wird, also ob es ein einzelnes Zeichen wäre oder ein Zuordnungs-Sequenzname für eines davon), das in »[.« und ».]« eingeschlossen ist, für die Zeichensequenz des Sortierordnungselements. Die Sequenz ist ein einzelnes Element der Klammerausdrucksliste. Eine Klammerausdrucksliste, die ein Mehrzeichen-Sortierordnungselement enthält, kann daher mit mehr als einem Zeichen übereinstimmen, falls beispielsweise die Sortierordnung ein Zuordnungslement »ch« enthält, dann stimmt der RA »[[.ch.]]*c« mit den ersten fünf Zeichen von »chchcc« überein.

Innerhalb eines Klammerausdrucks ist ein in »[=« und »=]« eingeschlossenes Sortierordnungselement eine Äquivalenzklasse, die für eine Abfolge von Zeichen aller Sortierordnungselemente steht, die äquivalent zu diesem sind, einschließlich ihm selbst. (Falls es keine anderen äquivalenten Sortierordnungselemente gibt, erfolgt die Behandlung also ob die Begrenzer »[.« und ».]« wären.) Falls beispielsweise o und ô die Mitglieder einer Äquivalenzklasse wären, dann wären »[[=o=]]«, »[[=ô=]]« und »[oô]« alle synonym. Eine Äquivalenzklasse darf nicht† der Endpunkt eines Bereichs sein.

Innerhalb eines Klammerausdrucks steht der Name einer Zeichenklasse, eingeschlossen in »[:« und »:]«, für eine Liste aller Zeichen, die zu der Klasse gehören. Standard-Zeichenklassennamen sind:

    alnum | digit | punct
    alpha | graph | space
    blank | lower | upper
    cntrl | print | xdigit

Diese stehen für die in wctype(3) definierten Zeichenklassen. Eine Locale könnte andere bereitstellen. Eine Zeichenklasse darf nicht als Endpunkt eines Bereichs verwandt werden.

Falls ein RA mit mehr als einer Teilzeichenkette einer gegebenen Zeichenkette übereinstimmen könnte, passt der RA auf die Teilzeichenkette, die am frühsten in der Zeichenkette beginnt. Falls der RA auf mehr als eine Teilzeichenkette passen könnte, die an diesem Punkt beginnt, stimmt er mit der längsten überein. Teilausdrücke passen auch auf die längsten möglichen Teilzeichenketten, mit der Nebenbedingung, dass die gesamte Übereinstimmung so lang wie möglich sein muss, wobei Teilausdrücke, die früher im RA beginnen gegenüber späteren Priorität haben. Beachten Sie, dass Teilausdrücke höherer Ordnung daher Priorität gegenüber ihren Komponententeilausdrücken niedrigerer Ordnung haben.

Die Länge von Übereinstimmungen wird in Zeichen gemessen, nicht in Sortierordnungselementen. Eine leere Zeichenkette wird als länger als keine Übereinstimmung betrachtet. Beispielsweise stimmt »bb*« mit den drei mittleren Zeichen von »abbbc« überein, »(wee|week)(knights|nights) stimmt mit allen zehn Zeichen von »weeknights« überein. Wird »(.*).*« auf »abc« angewandt, passt der geklammerte Unterausdruck auf alle drei Zeichen; und wenn »(a*)*« mit »bc« verglichen wird, passen der gesamte RA und der geklammerte Unterausdruck auf die leere Zeichenkette.

Falls der Vergleich unabhängig von der Groß-/Kleinschreibung verlangt wird, ist die Auswirkung so, als ob alle Unterscheidungen zwischen Groß- und Kleinschreibung im Alphabet verschwunden wären. Wenn ein alphabetisches Zeichen, das in verschiedenen Groß-/Kleinschreibungen existiert, als normales Zeichen außerhalb eines Klammerausdrucks auftaucht, wird es effektiv in einen Klammerausdruck, der Groß- und Kleinschreibung enthält, umgewandelt. Beispielsweise wird »x« zu »[xX]«. Wenn es innerhalb eines Klammerausdrucks auftaucht, werden alle Entsprechungen in der Groß-/Kleinschreibung zu dem Klammerausdruck hinzugefügt, so dass beispielsweise aus »[x]« »[xX]« und aus »[^x]« »[^xX]« wird.

Die Länge des RAs unterliegt keiner besonderen Beschränkung†. Programme, die portierbar sein sollen, sollten die RA kürzer als 256 byte halten, da eine POSIX-konforme Implementierung verweigern könnte, längere RA zu akzeptieren.

Veraltete (»einfache«) reguläre Ausdrücke unterscheiden sich in verschiedenen Hinsichten. »|«, »+« und »?« sind gewöhnliche Zeichen und es gibt kein Äquivalent für ihre Funktionalität. Die Begrenzer für Beschränkungen sind »\{« und »\}«; »{« und »}« alleinstehend sind gewöhnliche Zeichen. Die Klammern zum Verschachteln von Unterausdrücken sind »\(« und »\)«, »(« und »)« alleinstehend sind gewöhnliche Zeichen. »^« ist ein gewöhnliches Zeichen außer am Anfang eines RA oder† am Anfang eines geklammerten Unterausdrucks. »$« ist ein gewöhnliches Zeichen außer am Ende eines RA oder† am Ende eines geklammerten Unterausdrucks. »*« ist ein gewöhnliches Zeichen, falls es am Anfang des RA oder am Anfang des geklammerten Unterausdrucks (nach dem möglichen einleitenden »^«) auftaucht.

Schließlich gibt es eine neue Art von Atom, eine Rückwärtsreferenz: »\«, gefolgt von einer von Null verschiedenen Ziffer d stimmt mit der gleichen Abfolge von Zeichen überein, die auch mit dem dten geklammerten Unterausdruck übereinstimmt (die Nummerierung der Unterausdrücke erfolgt durch die Positionen ihrer öffnenden Klammern, von links nach rechts), so dass beispielsweise »\([bc]\)\1« mit »bb« oder »cc« aber nicht mit »bc« übereinstimmt.

FEHLER
Die Existenz von zwei Arten von RAs ist Murks.

Die aktuelle POSIX.2-Spezifikation sagt, dass »)« ein gewöhnliches Zeichen ist, falls das passende »(« fehlt; dies war ein ungeplantes Ergebnis eines Formulierungsfehlers und dies wird wahrscheinlich geändert. Verlassen Sie sich daher nicht darauf.

Rückwärtsreferenzen sind ein schrecklicher Murks. Sie stellen ein großes Problem für effiziente Implementierungen dar. Sie sind auch etwas vage definiert (stimmt »a\(\(b\)*\2\)*d« mit »abbbd« überein?). Verlassen Sie sich nicht darauf.

Die Spezifikation von POSIX.2 von Groß-/Kleinschreibung-unabhängiger Übereinstimmung ist vage. Die oben angegebene Definition von »eine Groß-/Kleinschreibungsvariante impliziert alle« ist der aktuelle Konsens zwischen den Implementierern über die richtige Interpretation.

AUTOR
Diese Seite entstammt Henry Spencers Paket Regex.

SIEHE AUCH
grep(1), regex(3)

POSIX.2, Abschnitt 2.8 (Notation Regulärer Ausdrücke).

ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von Helge Kreutzmann <debian@helgefjell.de> erstellt.

Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 (https://www.gnu.org/licenses/gpl-3.0.html) oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.

Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Übersetzer: debian-l10n-german@lists.debian.org.