|
Hier wird versucht, in knapper Form einen Überblick über
die Syntax der Regular Expressions (RE, RegExp) zu geben. Alle Angaben sind unverbindlich (!!), schon allein deshalb, weil sich die Syntax in den einzelnen Applikationen und deren Versionen etwas unterscheidet. |
Falls RE ein neues Thema für sie ist, dann besuchen sie die
RE-Startseite oder folgen einem der dort
angeführten Links. → Anwendung der RE in verschiedenen Programmen, → RE-Beispiele. |
Regular Expressions
|
Einführung in das Thema 'Regular Expressions' (RE) |
| RE in Programmen | RE in Programmiersprachen und Programmen |
Live RE Online
|
Live mit RE experimentieren |
| Aufgaben | Grundlegende Aufgaben: match, replace, store, split |
| Zeichen | Jedes Zeichen in einer RE steht für sich selbst |
| Sonderzeichen | Zeichen, die auch als RE-Operatoren verwendet werden |
| Klassen | Zusammenfassung von mehreren Zeichen zu RE-Klassen |
| Position | Die positions-abhängige Anwendung von Operatoren |
| Wiederholung | Operatoren für die Wiederholung von Zeichen und Joker |
| Logische Operatoren | Die logische Verknüpfung (UND, ODER, NICHT) von Regeln |
| Speichern | Speichern von (Teil)-Ergebnissen zur weiteren Verarbeitung |
| Nachgestellte Operatoren | Operatoren für die gesamte formulierte RE |
| Beispiele | Programmierung an typischen Beispielen |
| Links | Links zum Thema "Regular Expressions" |
Aufgaben von Regular Expressions (RE) |
|
|
Regular Expressions bieten leistungsfähige Funktionen zur Analyse und
Aufarbeitung von Texten (Zeichenketten, Strings). Die grundlegende Syntax (Grammatik) der RE ist gleich, die Anwendung je nach Programmiersprache etwas unterschiedlich. |
|
| Aufgabe | Erklärung |
| match |
Ausführung von Tests mit einem String. Die Test-Vorschrift wird als
RE formuliert. Das Ergebnis ist entweder true
oder false.
Der Original-String bleibt unverändert. Das Ergebnis ist nur
dann true, wenn der match mit der
gesamten RE zutrifft, nicht mit einem Teil davon. Anwendung: Entscheidung, ob ein String die gewünschten Kriterien erfüllt - Anschließend meist eine bedingte Verzweigung ( if ... ). |
| replace | Ersetzen eines oder mehrerer Teil-Strings in einem String. Die Vorschrift dazu wird als RE formuliert. Als Ergebnis wird der veränderte String zurückgegeben. (Stichwort substitute). |
| store | Speichern bzw Isolieren eines oder mehrerer Teil-Strings. Die Vorschrift dazu wird als RE formuliert. Als Ergebnis stehen beliebig viele gespeicherte Teile für die weitere Verarbeitung zur Verfügung, meist in einem Array. |
| split | Eine Sonderform der Funktion "store": Aufspaltung eines Strings nach einer Vorschrift, die als RE formuliert ist. Als Ergebnis stehen beliebig viele gespeicherte Teile für die weitere Verarbeitung zur Verfügung, meist als Array (Stichwort auch explode). Der Trenn-String selbst (meist ein einzelnes Trennzeichen) ist in den Ergebnissen nicht enthalten ! |
Sonderzeichen |
||||
| Einige Zeichen wie z.B. $ dienen als Operatoren. Wenn diese Zeichen selbst dargestellt werden sollen, dann werden sie mit einem vorangestellten \ Backslash 'maskiert', z.B. als \$ | ||||
| Symbol | Name | Hex | Beschreibung | |
| \$ | dollar | \x24 | Dollar-Zeichen | |
| \( | opening paranthesis | \x28 | Runde Klammer auf | |
| \) | closing paranthesis | \x29 | Runde Klammer zu | |
| \* | asterisk | \x2A | Stern | |
| \+ | plus sign | \x2B | Pluszeichen | |
| \. | period | \x2E | Punkt | |
| \/ | slash | \x2F | Schrägstrich | |
| \? | question mark | \x3F | Fragezeichen | |
| \[ | opening bracket | \x5B | Eckige Klammer auf | |
| \\ | backslash | \x5C | Rückwärts-Schrägstrich (in PHP \\\ oder \x{5C} ) | |
| \] | closing bracket | \x5D | Eckige Klammer zu | |
| \^ | caret (circimflex) | \x5E | Circumflex | |
| \{ | opening brace | \x7B | Geschwungene Klammer auf | |
| \| | vertical bar | \x7C | Senkrechter Strich | |
| \} | closing brace | \x7D | Geschwungene Klammer zu | |
| Darüber hinaus gelten folgende allgemeine Sonderzeichen: | ||||
| \0 | null | \x00 | Null-Byte (in PHP als \x{0} ) | |
| \b | backspace | \x08 | Zurück | |
| \t | tabulator (TAB) | \x09 | Tabulator | |
| \n | new line (LF) | \x0A | Neue Zeile | |
| \v | vertical tabulator | \x0B | Vertikaler Tabulator | |
| \f | form feed (FF) | \x0C | Neue Seite | |
| \r | carriage return (CR) | \x0D | Wagen-Rücklauf | |
| \x00 | 2-digit hex code |
Beliebiges Zeichen in Hex-Code \x00..\xFF \x40 bezeichnet z.B. das Zeichen @ Vorsicht: Zeichen \x80..\xFF sind auf Windows-PC non-Standard codiert, d.h. vom lokal verwendeten Zeichensatz abhängig ! |
||
| \x{0000} | (4-digit) hex code |
Beliebiges
→ Unicode-Zeichen in Hex-Code
\x0000..\xFFFF \x{20AC} bezeichnet z.B. das € Zeichen (weltweit eindeutig). |
||
|
●
PHP kann ein Null-Byte \x{0} nur so codieren, einen
Backslash \x{5C} am besten so. Je nach Umgebung (z.B. in MediaWiki) gibt es auch Probleme mit anderen Sonderzeichen. Codieren sie in diesem Fall mit \x{*} - Das funktioniert immer und ist leicht lesbar. (ersetzen sie * durch den Hex-UniCode des Zeichens). |
||||
| ♦ Details zum Thema Zeichen-Codes. | ||||
Zeichen-Klassen |
||
|
Klassen-Operatoren stehen jeweils für eine ganze Gruppe von Zeichen.
Sie werden nicht von allen Programmen und Programmier-Sprachen unterstützt. Verwenden sie in diesem Fall (PHP) die in [] angeführten User-Klassen. |
||
| Symbol | Bedeutung | Erklärung | \d | digit |
Ziffern 0..9, entspricht der Klasse [0-9]
oder [\x30-\x39] \d+ steht für mindestens eine Ziffer, \d{1,3} steht für 1..3 Ziffern. |
| \D | no digit | Keine Ziffer - jedes Zeichen außer 0..9, entspricht der Klasse [^0-9] |
| \s | space |
WhiteSpace: Leerzeichen (\x20),
Tabulator (\t \x09),
NewLine(\n \x0A),
VerticalTab(\v \x0B),
FormFeed (\f \x0C) oder
Carriage Return (\r \x0D). \s entspricht daher der Klasse [ \t\n\v\f\r] - Leerzeichen direkt nach der [ ! \s+ steht für mindestens ein WhiteSpace-Zeichen. |
| \S | no space | Kein WhiteSpace-Zeichen, entspricht der Klasse [^ \t\n\v\f\r] - ^ ist der NOT-Operator ! |
| \w | word | Buchstaben, Zahlen und _ underline (underscore \x5F ), entspricht der Klasse [0-9A-Z_a-z] |
| \W | no word | Alle außer den word-Zeichen, entspricht der Klasse [^0-9A-Z_a-z] |
|
[ ] [ - ] [^ ] |
User-definierte Klasse: Jedes Zeichen in [] zählt
als match-Zeichen (auch Leerzeichen). In [] werden alle Zeichen einzeln angeführt oder in [ - ] das erste und das letzte Zeichen in → ASCII bzw. → Unicode Reihenfolge. $t =~ m/refe[r]+er/; ergibt true für 'referer' und 'referrer' $t =~ m/M[ae][iy]er/; ergibt true für Mayer, Maier, Meier, ... false für Maler, Meer. $t =~ m/^[A-Z]/; ergibt true, wenn das erste Zeichen ein Großbuchstabe ist. Innerhalb von [] sind keine Sonderzeichen wirksam, dort steht jedes Zeichen für sich selbst. $t =~ m/[A-Z$]/; ergibt true, wenn der String mindestens einen Großbuchstaben oder '$' enthält Die Aussage wird umgekehrt, wenn der NOT-Operator ^ als erstes Zeichen in [] steht: $t =~ m/[^0-9a-z]/; ergibt true, wenn der String mindestens ein Zeichen enthält, welches keine Ziffer oder kein Kleinbuchstabe ist. Klassen können kombiniert werden: $t =~ m/[\s\.,]/; ergibt true, wenn der String ein WhiteSpace-Zeichen, Punkt oder Beistrich enthält. Mehrfach-Angaben in [] nicht durch Zeichen (blank, comma, ..) trennen, sonst werden diese in die Klasse mit aufgenommen ! Von-bis Klassen funktionieren sogar mit dem → EBCDIC-Zeichensatz, obwohl dort die Zeichen in anderer Reihenfolge codiert sind. |
|
| . | joker |
Der Punkt steht für genau 1 beliebiges Zeichen
außer \n
(nach besonderer Einstellung auch \n ). .+ steht für (mindestens) ein oder mehrere beliebige Zeichen .* steht für beliebig viele (auch 'keine') Zeichen. .{3} steht für genau 3 beliebige Zeichen. .{1,3} steht für 1..3 beliebige Zeichen. |
| ● Perl: Bei Verwendung von use locale werden auch die de-Sonderzeichen äöüÄÖÜß zu den \w-Zeichen gezählt. | ||
| ● PHP: Codieren sie einen Bereich von Sonderzeichen mit \x{*}-\x{*} - Das funktioniert immer und ist leicht lesbar (ersetzen sie * durch die Hex-Code des ersten und des letzten Zeichens). | ||
Position |
||
| Mit diesen Operatoren werden Regeln an bestimmte Positionen gebunden. | ||
| Symbol | Bedeutung | Erklärung |
| ^ |
Zeilen-Anfang, vorangestellt |
$t =~ m/^http:/;
ergibt true , wenn 'http' am
Zeilen-Anfang steht $t =~ m/^(\w*)/; speichert das erste Wort einer Zeile in $1 |
| $ |
Zeilen-Ende, nachgestellt |
$t =~ m/\.txt$/;
ergibt true, wenn '.txt' am
Zeilen-Ende steht $t =~ m/(\w*)$/; speichert das letzte Wort eines Textes in $1 |
| \A |
Text-Anfang, vorangestellt |
Für multiline-Anwendung.
^ matcht an jedem Zeilen-Anfang,
/A nur am Text-Anfang. /\A. / bezeichnet das erste Zeichen eines multiline-Textes. |
| \Z |
Text-Ende, nachgestellt |
Für multiline-Anwendung.
$ matcht an jedem Zeilen-Ende,
/Z nur am Text-Ende. /.\Z / bezeichnet das letzte Zeichen eines multiline-Textes. |
| $t =~ m/.+@.+/; ergibt true, wenn @ vorkommt, jedoch nicht an Anfang oder Ende. | ||
| Die folgende Operatoren werden nur von manchen Programmen unterstützt. Auch die Definition von "Wortgrenze" ist variabel. | ||
| \> | Wort-Anfang | Regel trifft am Wort-Anfang zu. |
| \> | Wort-Ende |
Regel trifft am Wort-Ende zu. $t =~ m/\.dat\>/; ergibt true für alle Dateinamen *.dat, die als Worte in Strings vorkommen. |
| \b |
Wortgrenze (border) |
Die Grenze zwischen \w und \W
oder umgekehrt. /\b./ ergibt true für alle Zeichen direkt nach einer Wortgrenze (inkl. das erste Zeichen). /.\b/ ergibt true für alle Zeichen direkt vor einer Wortgrenze. |
| \B | Keine Wortgrenze |
/\B./
ergibt true für alle Zeichen von Worten
außer dem ersten. /.\B/ ergibt true für alle Zeichen von Worten außer dem letzten. |
Wiederholungen & Joker |
||
| Mit den Wiederholungs-Operatoren werden Regeln wiederholt angewendet, z.B. auf ↑ Joker (beliebige Zeichen) oder bestimmte ↑ Zeichen-Klassen. | Es kann vorkommen, dass mehrere Regeln miteinander um Zeichen konkurrieren. In diesem Fall 'gewinnen' die gierigen (greedy) Varianten gegen die 'faulen' (lazy) Varianten. | |
| Symbol | Wiederholung | Erklärung |
| ? | 0..1, nachgestellt |
Dieser Operator ist 'gierig', d.h. der vorangestellte Bereich (Zeichen oder
String) wird nach Möglichkeit eingeschlossen. $t =~ m/html?$/; ergibt true , wenn $t auf 'htm' oder 'html' endet. $t =~ m/font-?[Ss]ize/; ergibt true, wenn der String 'fontSize' oder 'font-size' lautet. |
| ?? | 0..1, nachgestellt | Dieser Operator ist 'faul', d.h. der vorangestellte Bereich wird nach Möglichkeit ausgeschlossen. |
| + | 1..n, nachgestellt |
Dieser Operator ist 'gierig', d.h. der vorangestellte Bereich (Zeichen oder
String) wird nach Möglichkeit eingeschlossen. $t =~ m/Har+er/; ergibt true für Harer, Harrer, false für Harter, Hacker. |
| +? | 1..n, nachgestellt | Dieser Operator ist 'faul', d.h. der vorangestellte Bereich wird nach Möglichkeit ausgeschlossen. |
| . | genau 1 Zeichen |
Genauer: 1 beliebiges Zeichen außer \n
(nach besonderer Einstellung auch \n ) $t =~ m/Ma.er/; ergibt true für Mayer, Maier, Maler, ...false für Meier, Macher, .. |
| * | 0..n, nachgestellt |
Dieser Operator ist 'gierig', d.h. so viele Einheiten des vorangestellten
Bereichs wie möglich werden eingeschlossen. $t =~ m/Hau.*er/; ergibt true für Hauer, Hauser, Hausner, ... $t =~ m/(\w*)\s+(\w*)/; isoliert 2 beliebig lange Strings, die durch mindestens 1 Leerzeichen getrennt sind $t =~ s/^\s*/; entfernt führende Leerzeichen * ist gierig (greedy): der match wird mit dem verbleibenden Teilstring immer wieder versucht, so oft das möglich ist. |
| *? | 0..n, nachgestellt | Dieser Operator ist 'faul', d.h. der vorangestellte Bereich wird nach Möglichkeit ausgeschlossen. |
| {n} | genau n-mal, nachgestellt |
Genaue Anzahl der Wiederholungen als ganze Zahl in geschwungenen Klammern. $t =~ m/\d{10}/; ergibt true für 10-stellige österr. Sozialversicherungs-Nummern. Damit lassen sich diese Funktionen anderer Sprachen ersetzen: left, right, mid,.. $t =~ m/(.{3})/; speichert die ersten 3 Zeichen in $1 $t =~ m/(.{4})$/; speichert die letzten 4 Zeichen in $1 $t =~ m/.{2}(.{3})/; ignoriert 2 Zeichen und speichert die folgenden 3 Zeichen in $1 |
| {m,n} | {min,max}, nachgestellt |
Anzahl der minimalen und maximalen Wiederholungen als ganze Zahlen. Beide Argumente sind optional. Die Standardwerte (default) lauten m=0, n=∞ ? entspricht {0,1}, + entspricht {1,}, . entspricht {1,1}, * entspricht {,}. $t =~ m/\d{2,3}/; ergibt true für Texte mit 2- oder 3-stelligen Zahlen. |
| (?:) | passive Gruppierung |
Gruppierung ähnlich wie in der Mathematik. Der Inhalt wird nicht gespeichert ! $t = "xyz"; $t =~ m/(x)(y)(z)/; ergibt $1='x' $2='y' $3='z' $t =~ m/(x)(?:y)(z)/; ergibt $1='x' $2='z' |
Speichern zur weiteren Verarbeitung |
|
|
Damit werden alle Funktionen abgedeckt, welche Teile eines Strings entnehmen
oder verändern, wie z.B. left(), right(), mid(),
substr(), ... Beispiele dazu im Kapitel ↑ Wiederholungen Mit RE kann man diese Funktionen nicht nur 'nachbauen', man kann auch mehrere davon zu einem einzigen Befehl zusammenfassen. |
Mit der Verwendung runder () in RE werden automatisch
Variable erzeugt, welche das Ergebnis eines RE-match enthalten. Die Ergebnisse sind je nach Programmiersprache in Variablen mit festgelegten Namen und/oder in Arrays verfügbar. |
|
Beispiel (Perl): Der String $t enthält ein ISO-Datum. Es wird geprüft, ob der String 3 Zifferngruppen enthält, welche durch - Zeichen getrennt sind. Jede Zifferngruppe kann beliebig viele, jedoch mindestens eine + Ziffern \d enthalten und wird durch () gespeichert. Die automatisch erzeugten Variablen sind $1, $2, $3, ... Die Ergebnisse werden in der nächsten Zeile auf die Variablen $y, $m, $d übertragen. |
$t = '2004-05-20';
ergibt
if ( $t =~ m/(\d+)-(\d+)-(\d+)/ ) { my($y,$m,$d)=($1,$2,$3);
}
$y = 2004
$m = 05 $d = 20 |
|
In diesem Beispiel wird aus einem Dateinamen $fn die
file-extension $fext entnommen.
Dazu können 1..n beliebige
Zeichen .+ vor einem Punkt \. stehen,
der nachfolgende String .+ wird gespeichert. Der Punkt muss maskiert werden, da er sonst als Operator interpretiert wird. |
$fn = "test.txt";
if ( $fn =~ m/.+\.(.+)/ ) { $fext = $1;
}
|
| Hier wird die Funktion trim mit RE realisiert: Von einem String $t werden sowohl führende als auch nachfolgende Leerzeichen, Tabulatoren und ein allfälliges \n entfernt. Leerzeichen innerhalb des Strings bleiben erhalten. |
$t=' abc 123 xyz ';
if($t=~m/^[\s]*(.*[^\s]+)/) {$t=$1;} |