Der Regex-Dialekt in .NET
(Auszug aus "Reguläre Ausdrücke" von Jeffrey E. F. Friedl)
In .NET wird eine traditionelle NFA-Maschine verwendet. Wir können also alle wichtigen Erkenntnisse zum Verhalten von NFAs aus Wie Regex-Maschinen arbeiten, Regex-Methoden aus der Praxis und Die Kunst, reguläre Ausdrücke zu schreiben anwenden. In der folgenden Tabelle sind die Besonderheiten des Dialekts zusammengestellt; das meiste davon wurde schon unter Features und Dialekte beschrieben.
Bestimmte Ausprägungen des Dialekts können mit Modus-Modifikatoren (siehe Regex-Modi) beeinflusst werden; man kann manche Features bei Konstruktoren und Funktionen mittels Optionen ein- oder ausschalten, manche Modi kann man auch in der Regex selbst mit den Konstrukten ˹(?mods-mods)˼ und ˹(?mods-mods:...)˼ aktivieren. Die unterstützten Modus-Modifikatoren sind in der Tabelle Match-Modi und Modifikatoren bei .NET aufgeführt.
In der Tabelle sind die »nackten« Metasequenzen wie ˹\w˼ aufgeführt. In genau dieser Form können sie in den literalen Strings in VB.NET ("\w") und in den Verbatim-Strings von C# (@"\w") benutzt werden. Bei Sprachen ohne solche Regex-freundlichen Strings (z.B. C++) muss jeder Backslash aus der Regex im entsprechenden String verdoppelt werden ("\\w"). Siehe auch Strings als reguläre Ausdrücke.
Tabelle: Elemente von regulären Ausdrücken in .NET – Übersicht.
Abkürzungen für Zeichen 1. | |||
---|---|---|---|
siehe Abkürzungsmetazeichen | (K) | \a [\b] \e \f \n \r \t \v \oktal \x## \u#### \cZeichen | |
Zeichenklassen und ähnliche Konstrukte | |||
siehe Normale Klassen: [a-z] und [^a-z] | Klassen:2. [...] [^...] | ||
siehe Fast jedes Zeichen: Punkt | Jedes Zeichen außer Newline: Punkt (manchmal auch wirklich jedes Zeichen) | ||
siehe Abkürzungen für Zeichenklassen | (K) | Abkürzungen für Zeichenklassen:3. \w \d \s \W \D \S | |
siehe Unicode-Eigenschaften, Schriftsysteme (Scripts) und Blockbereiche | (K) | Unicode-Eigenschaften und -Blockbereiche:4. \p{Prop} \P{Prop} | |
Anker und andere Zusicherungen der Länge null | |||
siehe Zeilenanfang, Stringanfang | Anfang der Zeile oder des Strings: ^ \A | ||
siehe Zeilenende, Stringende | Ende der Zeile oder des Strings: $ \z \Z | ||
siehe Beginn der neuen (oder Ende der letzten) Mustersuche: \G | Ende des letzten Treffers:5. \G | ||
siehe Wortgrenzen | Wortgrenze: \b \B | ||
siehe Lookahead; Lookbehind | Lookaround:6. (?=...) (?!...) (?<=...) (?<!...) | ||
Kommentare und Modus-Modifikatoren | |||
siehe Modus-Modifikatoren | Modus-Modifikatoren: (?mod-mod) Erlaubte Modifikatoren: x s m i n (siehe: Match-Modi und Modifikatoren bei .NET) | ||
siehe Modus-Modifikatoren mit Klammerung | Bereich für Modus-Modifikatoren: (?mod-mod:...) | ||
siehe Kommentare | Kommentare: (?#...) | ||
Gruppieren und Einfangen von Text | |||
siehe Gruppierende und einfangende Klammern | Einfangende Klammern:7. (...) \1 \2 ... | ||
siehe Verschachtelte Konstrukte erkennen | Verschachtelte Konstrukte: (?<Name-Name>...) | ||
siehe Benannte Klammerausdrücke | Benannte Klammern und benannte Rückwärtsreferenzen: (?<Name>...) \k<Name> | ||
siehe Nur gruppierende (nicht-einfangende) Klammern | Nur gruppierende Klammern: (?:...) | ||
siehe Atomare Klammern | Atomare Gruppen: (?>...) | ||
siehe Alternation | Alternation: | | ||
siehe Gierige Quantoren | Gierige Quantoren: * + ? {n} {n,} {x,y} | ||
siehe Nicht-gierige, »genügsame« Quantoren | Nicht-gierige (genügsame) Quantoren: *? +? ?? {n}? {n,}? {x,y}? | ||
siehe Bedingte Klammerausdrücke | Bedingte reguläre Ausdrücke: (? if then|else) – »if« kann Lookaround, (Num) oder (Name) sein. | ||
(K) – kann auch in einer Zeichenklasse verwendet werden | 1....7. siehe Text |
Die folgenden Anmerkungen beziehen sich auf die obige Tabelle:
- Innerhalb einer Zeichenklasse steht \b für das Backspace-Zeichen, außerhalb für eine Wortgrenze (siehe Wortgrenzen).
Bei \x## sind genau zwei hexadezimale Zeichen zugelassen; ˹\xFCber˼ passt also auf ›über‹.
Bei \u#### sind genau vier hexadezimale Zeichen zugelassen; ˹\u00FCber˼ passt also auf ›über‹, und ˹\u20AC˼ passt auf ›€‹.
- Ab Version 2.0 unterstützt .NET Differenzen von Zeichenklassen wie etwa ˹[a-z-[aeiou]]˼ für die ASCII-Konsonanten (siehe Einfache Differenzen von Zeichenklassen: [[a-z]-[aeiou]]). Innerhalb einer Klasse kann man mit einem Minuszeichen und einer darauffolgenden inneren Klasse die Zeichen dieser Klasse von der äußeren subtrahieren.
- \w, \d und \s (und die entsprechenden Großbuchstaben-Versionen) erkennen normalerweise alle Arten von Unicode-Zeichen; wenn die Option RegexOptions.ECMAScript verwendet wird, aber nur reine ASCII-Zeichen (siehe ECMAScript-Modus).
Normalerweise gehören zur Zeichenklasse \w auch die Unicode-Eigenschaften \p{Ll}, \p{Lu}, \p{Lt}, \p{Lo}, \p{Nd} und \p{Pc}. Beachten Sie, dass die Eigenschaft \p{Lm} nicht dazugehört. (Eine Liste der Eigenschaften finden Sie in der Tabelle Grundlegende Unter-Eigenschaften in Unicode.)
Normalerweise ist \s dasselbe wie ˹[● \f\n\r\t\v\x85\p{Z}]˼. U+0085 ist dabei das Unicode-Steuerzeichen NEXT LINE, und \p{Z} enthält die »Separator«-Zeichen aus Unicode (siehe unter Unicode-Eigenschaften, Schriftsysteme (Scripts) und Blockbereiche).
- Mit \p{...} und \P{...} werden die meisten Unicode-Eigenschaften und -Blockbereiche von Unicode 4.0.1 unterstützt. Unicode-Scripts werden nicht unterstützt.
Bei Blockbereich-Namen muss das Präfix ›Is‹ verwendet werden (siehe dazu die Tabelle Unicode-Eigenschaften, -Schriftsysteme und -Blockbereiche in verschiedenen Sprachen), es ist dabei nur die kanonische Form ohne Unterstriche oder Leerzeichen zulässig. Also ist weder \p{Is_Greek_Extended} noch \p{Is Greek Extended} erlaubt, zulässig ist allein \p{IsGreekExtended}.
Es dürfen nur die kurzen Namen wie \p{Lu} für die Unicode-Eigenschaften benutzt werden, die ausgeschriebenen Namen wie \p{Lowercase_Letter} werden nicht unterstützt. Auch bei einbuchstabigen Eigenschaftsnamen müssen geschweifte Klammern angegeben werden (d.h., \pL kann nicht als Kurzform von \p{L} benutzt werden). (Siehe die Tabellen Unicode-Eigenschaften – Grundbegriffe und Grundlegende Unter-Eigenschaften in Unicode.)
Außerdem werden weder die besondere, zusammengesetzte Eigenschaft \p{L&} noch die Eigenschaften \p{Pi} und \p{Pf} unterstützt. Die speziellen Eigenschaften \p{All}, \p{Assigned} und \p{Unassigned} werden auch nicht unterstützt, man kann dafür ˹(?s:.)˼, ˹\P{Cn}˼ und ˹\p{Cn}˼ verwenden.
- \G bezieht sich auf das Ende des letzten Treffers, auch wenn die Dokumentation behauptet, es beziehe sich auf den Anfang des aktuellen Treffers (siehe Beginn der neuen (oder Ende der letzten) Mustersuche: \G).
- Sowohl beim Lookahead als auch beim Lookbehind können beliebige reguläre Ausdrücke verwendet werden. Zu dem Zeitpunkt, als ich dieses Kapitel schrieb, war die .NET-Implementation die einzige mir bekannte Regex-Maschine, die in Lookbehind-Konstrukten Ausdrücke zuließ, die Texte beliebiger Länge erkennen können (siehe Lookahead; Lookbehind).
- Mit der Option RegexOptions.ExplicitCapture (oder dem Modus-Modifikator (?n)) werden die normalen Klammern ˹(...)˼ zu nicht-einfangenden Klammern. Nur mit explizit benannten Klammern wie ˹(?<num>\d+)˼ kann man dann noch Textstücke einfangen (siehe Benannte Unterausdrücke). Wenn man benannte Klammern benutzt, kann man also die unschönen nur gruppierenden Klammern ˹(?...)˼ durch ˹(...)˼ ersetzen.
Tabelle: Match-Modi und Modifikatoren bei .NET.
RegexOptions-Option | (?mod) | Beschreibung |
---|---|---|
.Singleline | s | Punkt passt auf jedes Zeichen (siehe Der Modus »Punkt passt auf alles«). |
.Multiline | m | ˹^˼ und ˹$˼ passen auch bei Zeilenanfang und -ende mitten im String. |
.IgnorePatternWhitespace | x | Modus »Freie Form«, Kommentare. |
.IgnoreCase | i | Groß- und Kleinbuchstaben werden als äquivalent angesehen. |
.ExplicitCapture | n | Normale Klammern ˹(...)˼ fangen keinen Text mehr ein, nur noch die benannten Klammern ˹(?<Name>...)˼. |
.ECMAScript | Die Zeichenklassen ˹\w˼, ˹\s˼ und ˹\d˼ enthalten nur noch ASCII-Zeichen (siehe ECMAScript-Modus). | |
.RightToLeft | Das Getriebe setzt die Regex an jeder Position an, aber in umgekehrter Richtung, d.h., es beginnt am Ende des Suchstrings und bewegt sich zum Anfang. Diese Option enthält allerdings Fehler (siehe Mustersuche von rechts nach links). | |
.Compiled | Optimiert die Regex in der Kompilierungsphase, so dass sie bei der Anwendung effizienter wird (siehe Optimierte Ausdrücke mit »Compiled«). | |
<< zurück | vor >> |
Tipp der data2type-Redaktion: Zum Thema Reguläre Ausdrücke bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an: |
Copyright der deutschen Ausgabe © 2008 by O’Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "Reguläre Ausdrücke" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.
O’Reilly Verlag GmbH & Co. KG, Balthasarstr. 81, 50670 Köln