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:

alter table kunden 
add constraint ch_email_gueltig
check (regexp_like(email, '^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$'))

Hier wird die SQL-Funktion REGEXP_LIKE verwendet. Sie testet, ob der angegebene reguläre Ausdruck in der Zeichenkette existiert.

Syntaxdiagramm zu REGEXP_LIKE

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.

Hinterlegung einer Validierung in Application Express

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.

Syntaxdiagrammm zu REGEXP_REPLACE

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:
select
  cust_last_name,
  upper(regexp_replace(cust_last_name, '(.)','\1 ')) cust_last_name__print
from demo_customers

CUST_LAST_NAME       CUST_LAST_NAME__PRINT
-------------------- ---------------------
Bradley              B R A D L E Y
Dulles               D U L L E S
Hartsfield           H A R T S F I E L D
LaGuardia            L A G U A R D I A
Lambert              L A M B E R T
Logan                L O G A N
OHare                O H A R E

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 ...

select
  regexp_replace('Heinz   Müller','( ){2,}',' ') normalize_space
from dual

NORMALIZE_SPACE
---------------
Heinz Müller

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 ")".

select regexp_replace(
  '09172 0000000' ,
  '^(0)(\d{2,4})(\s*|-)(.*)',
  '+49 (0)\2 \4'
) as telefon_int
from  dual

TELEFON_INT
-------------------
+49 (0)9172 0000000

Beispiel: Extraktion von Daten

Mit der Funktion REGEXP_SUBSTR wird der Teil der Zeichenkette, der zum regulären Ausdruck passt, extrahiert:

Syntaxdiagramm für REGEXP_REPLACE

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:

select 
  regexp_substr(ortsangabe, '[[:digit:]]{5,5}') plz,
  regexp_substr(ortsangabe, '( )(.)*') ort
from adressen

PLZ        ORT
---------- ----------
80992       München
80997       München
54516       Wittlich

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