Wie bereits auf WasSindRegexen gesagt kann man Regexen als eine Art Programmiersprache für die Beschreibung von Mustern in Zeichenketten betrachten. Und als Sprache bestehen Regexen natürlich aus verschiedenen Elementen. ZeichenUnter Zeichen verstehen wir z.B. A, b, &, #. Daraus können wir Zeichenketten aufbauen die wie suchen wollen, z.B: 'String' - diese Kette trifft zu wenn sie in einer Eingabe auf 'String' trifft. Dies gilt auch wenn 'String' Teil eines längeren Wortes ist. Will man nur auf die Kette String reagieren, so benötigt man Begrenzungszeichen. Mehr dazu weiter unten. Einige Zeichen werden allerdings in Regexen als Steuerzeichen oder ähnliches verwendet, man muss sie also besonders behandeln wenn man sie 'escapen', d.h. kennzeichnen daß sie nicht als Steuerzeichen verwendet werden sollen. Ebenso muss man nicht druckbare Zeichen 'escapen', will man sie im Suchmuster verwenden, dies geschieht durch Voranstellen eines '\'. Steuerzeichen sind: . $ ^ { [ ( | ) * + ? \ Nicht darstellbare Zeichen sind: \a Alarm(Bell) \b Backspace - Achtung, dies ist ein Sonderfall den wir an anderer Stelle gesondert behandeln. \e Escape \f Formularvorschub \n Newline \r Wagenrücklauf \t Tabulator \v Vertikaler Tabulator \cX Steuerzeichen, hier als Beispiel strg-X Zeichen können auch mittels Ihres ASCII/Unicodes spezifiert werden: \040 Oktales Format, 1 - 3 Stellen - ist die Zahl einstellig ohne führende '0' oder entspricht sie einer 'Capture'-gruppe, so wird sie als Rückbezug aufgefasst \x20 Hexadezimalformat, 2 Stellen \u0020 Unicode hexadezimal, 4 Stellen MengenangabenHäufig will man ein Zeichen mehr als einmal oder genau eine bestimmte Anzahl treffen. Diese Angaben lassen sich wie folgt machen: Allgemeine Angaben: * Null oder mehrfach + Einmal oder mehr ? Null oder einmal Spezifische Angaben: {n} genau n-mal {n,} mindestens n-mal {n,m} mindestens n-mal, maximal m-mal. m > n 'Gierigkeit' mindern (siehe auch 'RegexGierigkeit') durch Anhängen eines '?', z.B.: *? Möglichst wenige Treffer ?? Null wenn möglich, sonst ein Treffer {n,m}? Mindestens n Treffer, aber so wenige wie möglich ZeichenklassenWenn an einer Stelle einer Regex verschiedene Zeichen zugelassen sein sollen, muss man das ja irgendwie angeben können. Dazu sind Zeichenklassen da. Man definert eine Zeichenklasse indem man die erlaubten Zeichen in eckige Klammern setzt: [aBCD] entspricht 'hier ist kleines a oder grosses B, C oder D erlaubt Man kann natürlich auch Abkürzungen verwenden, das ganze Alphabet in Gross- und Kleinschreibung explizit angeben wäre ja lästig, ebenso wie Ziffern. Kontinuierliche Folgen werden durch erstes und letztes Zeichen, verbunden durch ein '-' spezifiert: [a-zA-Z0-9] entspricht allen Klein- und Grossbuchstaben und allen Ziffern Da Programmierer faul^H^H^H^H effizient sind, gibt es Kürzel für ganz spezielle Klassen:
Das Thema 'Zeichenklassen' wird in einer eigenen Rubrik 'RegexZeichenKlassen' ausführlicher behandelt. Ebenso kann man bestimmte Zeichen ausschliessen. Dies erreicht man durch ein vorangestelltes '^': [^a-z] steht für 'alles ausser Kleinbuchstaben' SteuerzeichenUnd mit der Vorstellung des '^' wären wir bei den Steuerzeichen für das Verhalten von Regexen angelangt. Dieses Steuerzeichen hat allerdings ausserhalb einer Zeichenklasse eine völlig andere Bedeutung. Es ist ein sogenannter 'Anker', der das Suchmuster innerhalb des zu untersuchenden Strings an eine bestimmte Position bindet. Es gibt verschiedene Anker: ^ Anfang des String, bzw. Zeilenanfang bei 'multiline' Option (siehe RegexOptionen) $ Ende des String, bzw. Zeilenende oder vor \n bei 'multiline' Option \A Anfang des String, auch bei 'multiline' \Z Ende des String oder vor \n, auch bei 'multiline' \z Ende des String, auch bei 'multiline' \b Wortgrenze (zwischen zwei Zeichen \w und \W) - dies ist der oben angesprochene Sonderfall. \b als 'Backspace' gilt nur in Zeichenklassen oder Ersetzungsmustern \B Verneinung von \b \G Muss an den vorhergehenden Treffer anschliessen Nicht vergessen: Anker treffen zwischen Zeichen zu, sie liegen niemals auf einem Zeichen! SonstigesWeitere Elemente von Regexen werden auf separaten Seiten abgehandelt: |
|