• +49-(0)721-402485-12
Ihre Experten für XML, XQuery und XML-Datenbanken

Besonderheiten der Auswertung regulärer Ausdrücke in XQuery

Bei der Auswertung regulärer Ausdrücke im Kontext von XQuery wird im Gegensatz zur Analyse von Zeichenketten keine explizite Sortierordnung berücksichtigt, sondern die Auswertung erfolgt auf Basis der Unicode-Codepoints. Des Weiteren besitzt jede Funktion einen Parameter $flags, mit dem der Modus der Auswertung des regulären Ausdrucks angegeben werden kann. Im Einzelnen werden folgende Indikatoren unterstützt:

Einzelzeilenmodus ($flag = "s")
Die Auswertung des regulären Ausdrucks bei der Auswertung des .-Kriteriums erfolgt im Zeichenketten- und nicht im Zeilenmodus und dadurch zeilenübergreifend, so dass ein .-Symbol auch einen Zeilenwechsel interpretiert.

fn:match("XQuery-
Buch", "XQ.*ch")
liefert false
fn:match("XQuery-
Buch", "XQ.*ch", "s")
liefert true

Mehrzeilenmodus ($flag = "m")
Die Auswertung erfolgt lokal pro Zeile, so dass ein ^ bzw. $-Symbol irgendeinen Zeilenstart bzw. ein Zeilenendesymbol innerhalb einer Zeichenkette erkennt.

fn:match("XQuery-
Buch", "^B.*h$")
liefert false
fn:match("XQuery-
Buch", "^B.*h$", "m")
liefert true

Sensitivität bzgl. Groß-/Kleinschreibung ($flag = "i")
Bei gesetztem Flag wird zwischen Groß- und Kleinschreibung nicht unterschieden:

fn:match("XQuery-Buch", "xq.*CH", "i")

liefert true

Ignorierung von Leerzeichen im regulären Ausdruck ($flag = "x")
Dieser Indikator gibt an, ob Leerzeichen im regulären Ausdruck Gegenstand der Auswertung sind (Standardverhalten) oder keine explizite Beachtung finden (zum Beispiel zur Verbesserung der Darstellungsweise).

In Ergänzung zu den in XML Schema zulässigen Definitionen eines regulären Ausdrucks ermöglichen die Zeichenkettenfunktionen folgende Erweiterung (in Anlehnung an die Programmiersprache Perl):

Erkennung von Beginn und Ende einer Zeichenkette
Die beiden Symbole "^" und "$" erlauben die Identifzierung des Beginns bzw. des Endes einer Zeichenkette. Im folgenden Beispiel muss die Zeichenkette mit einem "X" beginnen und mit einem "h" enden:

fn:matches("XQuery-Buch", "^X.*h$")

liefert true

Erkennung des minimalen Teilstrings
Ein regulärer Ausdruck kann durch einen zusätzlichen "?"-Modifikator erweitert werden, der besagt, dass der kleinstmögliche Teilstring einer Zeichenkette, der den regulären Ausdruck erfüllt, erkannt werden soll. Ohne diesen Zusatz ist es das Ziel, bei der Auswertung von regulären Ausdrücken den größtmöglichen Teilstring in der Originalzeichenkette zu identifizieren. Diese Erweiterung ist offensichtlich uninteressant für die Funktion fn:matches(), da hiermit nur die Existenz (und nicht der eigentliche Gegenstand) einer positiven Erfüllung des Ausdrucks von Interesse ist.
Folgendes Beispiel illustriert die unterschiedliche Semantik.

replace("XXXX", "X+", "Y")

liefert "Y"

replace("XXXX", "X+?", "Y")

liefert "YYYY"

Im ersten Fall wird die Ersetzung durch den String "Y" dadurch vorgenommen, dass der größtmögliche Teilstring ersetzt wird, der den regulären Ausdruck erfüllt. Im konstruierten Beispiel korrespondiert dies zu dem Originalstringwert, der ein einziges Mal ersetzt wird. Im zweiten Fall wird durch den zusätzlichen Modifikator der kleinstmögliche Teilstring identifiziert, der den regulären Ausdruck erfüllt. Im Beispiel ist dies jeweils ein einzelnes Zeichen "X", welches viermal hintereinander durch "Y" ersetzt wird.

Erkennung regulärer Unterausdrücke
In Analogie zur Perl-Programmiersprache wird bei der Auswertung der regulären Ausdrücke in XQuery ein Rückgriff auf Unterausdrücke über die laufende Nummer des jeweiligen Ausdrucks ermöglicht. Ein Unterausdruck wird durch Klammerung im regulären Ausdruck gekennzeichnet. Im Ersetzungsteil werden durch die Variablen $1 bis $9 die durch den Ausdruck referenzierten Teilstrings identifiziert. Folgendes Beispiel bildet drei Gruppen, wobei die erste "Query", die zweite das Zeichen "-" und die dritte Gruppe den String "Buch" repräsentiert:

replace("XQuery-Buch", "^X(.*)(-)(B.*)", "$3 und $1")

liefert "Buch und Query"

Rückwärtsreferenzierung
Innerhalb eines regulären Ausdrucks ist die Rückwärtsreferenzierung auf einen bereits erkannten Teilstring erlaubt. Ein mögliches Ziel einer Rückwärtsreferenzierung wird dabei analog zum vorangegangenen Konzept der Unterausdrücke durch Klammerung verdeutlicht. Eine Referenz auf einen Unterausdruck innerhalb eines regulären Ausdrucks erfolgt durch die Angabe von "\n" mit "n" als Nummer des zuletzt referenzierten Ausdrucks. Der folgende Ausdruck

^('|").*\1

erkennt dabei eine Zeichenkette, die mit einfachen oder doppelten Anführungszeichen umschlossen ist, wobei die Rückwärtsreferenzierung sicherstellt, dass das Ende der Zeichenkette mit dem gleichen Teilausdruck wie der Beginn der Zeichenkette erkannt wird. Der zentrale Unterschied zwischen dem Prinzip der Erkennung von Unterausdrücken und der Rückwärtsreferenzierung besteht somit darin, dass im ersten Fall eine Referenz auf einen erkannten Teilstring bei der Konstruktion des Ergebniswertes auftritt, während im Fall der Rückwärtsreferenzierung eine Referenz auf einen erkannten Teilstring innerhalb des regulären Ausdrucks erfolgt. Folgendes Beispiel illustriert den Unterschied innerhalb eines Aufrufs der Funktion fn:replace():

replace($x,"^('| "").*\1","Mit $1 umschlossener Text")

Die Anweisung ergänzt dabei einen korrekt eingeschlossenen Text durch die Information, welches Anführungszeichen verwendet wird. Während der \1-Anteil die Rückwärtsreferenzierung repräsentiert, wird mit dem $1-Anteil auf den erkannten Wert zurückgegriffen. Im regulären Ausdruck muss dabei das Zeichen » " « verdoppelt werden, weil es innerhalb eines String-Literals auftritt, welches selbst durch ein Anführungszeichen begrenzt ist.

Die Vielzahl der Parameter und punktuellen Erweiterungen zeigen, dass der "Textverarbeitung" in XQuery ein hoher Stellenwert eingeräumt wird.

 

Quelle: "XQuery – Grundlagen und fortgeschrittene Methoden", dpunkt-Verlag, Heidelberg (2004)

<< zurückvor >>