Reguläre Ausdrücke in Application Express
Reguläre Ausdrücke (regular expressions, regexp) sind in der Anwendungsentwicklung
weit verbreitet und erlauben sehr mächtige Operationen mit
Zeichenketten. Beispiele für solche Operationen sind
pattern matching oder komplexes Find & Replace.
Ihren Ursprung
haben Reguläre Ausdrücke in den Skriptsprachen der
UNIX-Welt (Perl). Ihre Mächtigkeit führte jedoch schnell dazu,
dass inzwischen für nahezu alle Programmiersprachen und
Entwicklungsumgebungen Implementierungen existieren.
Die kompakte und standardisierte Syntax
legt es nahe, komplexe Operationen auf Zeichenketten
auch in der Datenbank mit
Regulären Ausdrücken durchzuführen. Die Anwendungsbeispiele
sind so vielfälig wie die Praxis:
-
Formatprüfungen
IP-Adressen, e-Mail-Adressen, Bankleitzahlen, KFZ-Kennzeichen, ...
-
Zeichenketten extrahieren
Extraktion der Postleitzahl aus einer Adresse
-
Komplexes Find & Replace
Telefonnummern umformatieren von 089 ... in +49 (0) 89 ...
Seit Oracle10g Release 1 werden Reguläre Ausdrücke
von der Oracle-Datenbank nativ unterstützt. Damit
einher geht auch die Unterstützung in Application Express.
Im folgenden werden die Möglichkeiten mit regulären Ausdrücken
anhand praktischer Beispiele vorgestellt. Eine vollständige
Referenz für die Syntax regulärer Ausdrücke soll hier nicht
wiedergegeben werden - dafür steht die einschlägige Literatur
bzw. Dokumentation zur Verfügung.
Reguläre Ausdrücke: Kurzeinführung
Ein regulärer Ausdruck repräsentiert ein Muster (pattern). Anhand dieses Musters werden dann
in der zu durchsuchenden Menge (eine Datei oder einer Tabelle in der Datenbank
passende Zeichenketten gefunden (pattern matching).
Zeichen, die beim Suchen direkt übereinstimmen müssen, werden auch
als solche in einem regulären Ausdruck notiert.
Zusätzlich können Metazeichen
notiert werden - sie stehen für ganze Gruppen
von Zeichen. Die folgende Tabelle zeigt die gängigsten Metazeichen.
Zeichen |
Bedeutung |
. |
... steht für ein beliebiges Zeichen. |
[ABC] |
Eckige Klammern beschreiben eine Auswahl. Dieses Beispiel steht also
für das Zeichen A,B oder C.
|
[A-Z] |
Der Bindestrich innerhalb eckiger Klammern bestimmt einen Bereich. Daher
steht dieses Beispiel für alle Zeichen des lateinischen Alphabets.
|
[^A] |
Das Dach (^) negiert die Auswahl. Daher werden hier alle Zeichen des
lateinischen Alphabets außer "A" angesprochen.
|
+ |
... kennzeichnet eine Mengenangabe. Das "+" steht für ein oder mehrere
Vorkommen des Zeichens oder Metazeichens.
|
* |
... steht für Null bis viele Vorkommen des Zeichens oder Metazeichens.
|
{m,n} |
... steht für "m" bis "n" Vorkommen des Zeichens oder Metazeichens.
|
^ |
... bezeichnet, dass das Zeichen oder Metazeichen am Anfang der Zeichenkette
vorkommen muss.
|
$ |
... bezeichnet, dass das Zeichen oder Metazeichen am Ende der Zeichenkette
vorkommen muss.
|
() |
... dienen zur Gruppierung von Regulären Ausdrücken. Speziell für Find & Replace
ist dies wichtig, denn bei der Ersetzung können die Gruppen dann mit
dem Backslash ("\1" bis "\n") einzeln angesprochen
werden
|
Darüber hinaus stehen ab Oracle10g Release 2 auch die sog. Zeichenklassen bereit. Die folgende
Tabelle enthält einige Beispiele:
Zeichen |
Bedeutung |
[:digit:] |
... steht für die Ziffern von "0" bis "9". |
[:lower:] |
... steht für kleingeschriebene Buchstaben. Dies beinhaltet die
Zeichen von "A" bis "Z" zzgl. sprachspezifischer Sonderzeichen (ä,ü,ö).
|
[:upper:] |
... steht für großgeschriebene Buchstaben. Dies beinhaltet die
Zeichen von "A" bis "Z" zzgl. sprachspezifischer Sonderzeichen (ä,ü,ö).
|
[:alpha:] |
... steht für die Vereinigung von [:lower:] und [:upper:] .
|
[:blank:] |
... steht für alle Arten von Leerzeichen, also Tabulator und Blanks.
|
Die Oracle-Datenbank stellt vier Funktionen zum Umgang mit regulären
Ausdrücken bereit. Die Funktionen können in jeder SQL-Abfrage und in jedem
PL/SQL-Block verwendet werden:
-
REGEXP_LIKE stellt fest, ob ein Muster
in der Zeichenkette existiert.
-
REGEXP_SUBSTR extrahiert die zum regulären
Ausdruck passende (Teil-)Zeichenkette.
-
REGEXP_INSTR gibt die Zeichenposition zurück,
an der die zum Ausdruck passende Teilzeichenkette beginnt.
-
REGEXP_REPLACE ersetzt die zum Ausdruck
passende Teilzeichenkette durch eine andere.
Beispiel: Formatprüfung auf eine gültige Mail-Adresse
Eine solche Formatprüfung sollte auf zwei Ebenen hinterlegt
werden. Da meist mehrere Anwendungen auf einem Datenbestand
arbeiten, ist es nicht ausreichend, die Prüfung
allein in der Anwendung zu hinterlegen. Sinnvoll und richtig
ist die Anbringung direkt an der Tabelle als Check-Constraint:
Hier wird die SQL-Funktion REGEXP_LIKE verwendet. Sie testet, ob
der angegebene reguläre Ausdruck in der Zeichenkette existiert.
Abb. 1: Syntaxdiagramm zu REGEXP_LIKE
Wird nun eine ungültige Mailadresse eingegeben, so löst
die Datenbank eine ORA-Fehlermeldung aus. Für eine Application
Express-Anwendung bietet sich darüber hinaus die Hinterlegung
einer Validierung an (Abbildung 2). Der Vorteil ist, dass im
Fehlerfall eine passende Fehlermeldung direkt beim Eingabefeld
angezeigt werden kann.
Abb.2: Hinterlegung einer Validierung in Application Express
Mit dieser Konstruktion wird nun sichergestellt, dass keine
ungültigen Mail-Adressen eingegeben werden. Eingaben in einer Application
Express-Anwendung werden bereits von dieser selbst, Eingaben
auf anderen Wegen (SQL*Plus) durch den hinterlegten Check-Constraint
abgefangen.
Beispiel: Komplexes Find & Replace
Reguläre Ausdrücke eignen sich auch hervorragend für kompliziertere
Find & Replace-Aufgaben. Dazu steht die Funktion REGEXP_REPLACE bereit.
Abb.3: Syntaxdiagrammm zu REGEXP_REPLACE
Das folgende Beispiel zeigt, wie man
bspw. einen Nachnamen in Großschreibung und mit jeweils einem Leerschritt
Zeichenabstand umwandelt:
Damit lassen sich reguläre Ausdrücke für die Aufbereitung von Daten
aller Art gebrauchen - ein weiteres Beispiel wäre die Normalisierung
von Leerzeichen ...
Das nächste Beispiel zeigt die Umwandlung von Telefonnummern aus dem
deutschen in ein internationales Format. Wichtig ist in diesem Beispiel, dass die
Vorwahl von der Rufnummer durch ein Leerzeichen oder einen Bindestrich
getrennt wird. Es ist jedoch durchaus möglich, reguläre Ausdrücke zu
formulieren, die noch mächtiger sind und mit noch anderen Formaten umgehen können.
Dieser reguläre Ausdruck macht starken Gebrauch von der Gruppierung mit "(" und ")".
Beispiel: Extraktion von Daten
Mit der Funktion REGEXP_SUBSTR wird der Teil der Zeichenkette, der
zum regulären Ausdruck passt, extrahiert:
Abb.2: Syntaxdiagramm für REGEXP_REPLACE
Angenommen, die Postleitzahl und der Ort liegen in nur einem Textfeld
vor, so lassen sich diese einfach mit einem regulären Ausdruck trennen:
Der große Vorteil regulärer Ausdrücke ist, dass Sie nur mit einer kompakten
Zeichenkette Aufgaben erledigen können,
für die Sie ansonsten mehr oder weniger umfangreiche Programmierung benötigen
würden. Die Nutzung der regulären Ausdrücke bringt Ihr Projekt schneller zum Ziel.
Weitere Informationen zu Regulären Ausdrücken:
Zurück zur Community-Seite
|