fn:replace
(Auszug aus "XSLT 2.0 & XPath 2.0" von Frank Bongers, Kapitel 5.)
A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z
Kategorie: Stringfunktionen – Patternmatching
Herkunft: XPath 2.0
Rückgabewert: Ein String xs:string; der Eingabestring, in dem alle Instanzen von Matches des regulären Ausdrucks durch den Ersatzstring ausgetauscht sind.
Aufruf/Argumente:
fn:replace($eingabestring? $reg-ex, $ersatzstring?, $flags?)
$eingabestring:
Optional. Ein Eingabestring xs:string, in dem mittels des regulären Ausdruck des zweiten Arguments diejenigen Teilstrings, auf die ein Match erfolgt, jeweils durch die Ersatzzeichenkette des dritten Arguments ersetzt werden. Wird die leere Sequenz übergeben, so wird dies wie der leere String behandelt.
$reg-ex:
Obligatorisch. Das Argument besteht aus einem regulären Ausdruck (regular expression), der zur Prüfung des Strings herangezogen wird.
$ersatzstring:
Obligatorisch. Ein Ersatzstring xs:string, durch den alle sich nicht überlappenden Matches des Reg-Ex auf den Eingabestring jeweils ersetzt werden. Innerhalb des Ersatzstrings sind Referenzen in Form von Subgruppenvariablen $1 ... $N auf Subgruppen 1 bis N des Reg-Ex-Matches möglich. Ist der Ersatzstring leer bzw. wird als drittes Argument die leere Sequenz übergeben, so werden alle Matches im Eingabestring durch den leeren String ersetzt.
$flags:
Optional. Mittels des Flags-Arguments kann die Wirkung des regulären Ausdrucks gesteuert werden. Wird für $flags der leere String oder die leere Sequenz übergeben, oder entfällt das Flags-Argument, so wird per Default erstens »case-sensitive« geprüft und zweitens den Eingabestring als geschlossene (nicht zeilenorientierte) Zeichenkette betrachtet.
Verwendungszweck:
Mittels der Funktion fn:replace() werden alle Instanzen der durch einen Match des Reg-Ex bezeichneten Teilstrings jeweils durch die Ersatzzeichenkette des dritten Arguments ersetzt. Überlappen sich zwei Matches, so wird nur der Bereich des ersten Matches ersetzt.
Ein Match tritt dann auf, wenn der reguläre Ausdruck an einer oder mehreren Stellen des untersuchten Strings zutrifft. Hierbei wird Groß-/Kleinschreibung beachtet (case-sensitive), Zeilenumbruchzeichen innerhalb des übergebenen Strings werden als normale Zeichen gewertet (Stringmodus). Alle durch den Match aufgefundenen Teilstrings werden ersetzt.
Es ist ein Fehler, wenn der reguläre Ausdruck in seiner Gesamtheit auf den leeren String passt (»Regular expression matches zero-length string«, err:FORX0003). Hingegen darf ein in einer Untergruppe gespeicherter Teilstring (captured substring) durchaus leer sein – in diesem Fall nämlich wurde für die betreffende Untergruppe lediglich kein Match verzeichnet.
Setzen von Flags mit dem $flags-Argument:
Um das Verhalten des regulären Ausdrucks zu modifizieren, darf zusätzlich zum Eingabestring, dem regulären Ausdruck und dem Ersatzstring als viertes Argument ein String als sogenanntes »Flag« übergeben werden. Die erlaubten Flags sind an die Konventionen von Perl angelehnt.
Achtung – Abweichung zu Flags in Perl-Syntax:
Das Perl-Flag g (»global«) wird in XPath nicht unterstützt!
Das Argument darf aus den Einzelbuchstaben m, i, s, x oder (in unbestimmter Reihenfolge) aus sinnvollen Kombinationen von diesen besteht. Auch der leere String (bzw. die leere Sequenz) ist gestattet. Ein ungültiges (also von den erlaubten Zeichen abweichendes) Flag-Argument quittiert der Prozessor mit der Fehlermeldung »Invalid regular expression. flags« (err:FORX0001).
Flagsymbol | Beschreibung |
---|---|
i | »ignore« – ignoriert für die Matches die Groß-/Kleinschreibung im untersuchten String. |
m | »multiline« – beachtet Zeilenumbrüche im untersuchten String (erlaubt einen mehrfachen Match durch die Pattern ^ und $). |
s | Schaltet in den sogenannten »dot-all« Modus um. Erläuterung: Beeinflusst wird das Verhalten des Metazeichens ».« ( dot) – ohne gesetztes s-Flag trifft dieses Metazeichen auf alle Zeichen (auch Whitespace!) zu, außer auf das Zeilenumbruchzeichen #x0A (NL). |
x | Deaktiviert die Beachtung der Whitespace-Zeichen #x9, #xA, #xD und #x20 innerhalb des regulären Ausdrucks. Ist das Flag nicht gesetzt, werden Whitespace-Zeichen hingegen als Teil des Ausdrucks betrachtet und für den Match berücksichtigt. Erläuterung: Das gesetzte Flag x ermöglicht, längere reguläre Ausdrücke durch den Einsatz von Zeilenumbrüchen und Tabulatoren übersichtlicher zu gestalten. |
'' | Der leere String – dieser ist als Wert ausdrücklich gestattet. Er entspricht der Nicht-Übergabe eines Flag-Arguments. |
Tabelle: In XPath erlaubte Symbole für Flags in regulären Ausdrücken.
Flag 'i':
Der Wert 'i' (»ignore«) bewirkt das Nichtbeachten von Groß-/Kleinschreibung im untersuchten String. Ein Match wird auch dann gemeldet, wenn der gefundene Teilstring in der Schreibweise nicht mit dem Pattern übereinstimmt:
fn:replace('ABCabc', 'a', 'X', 'i')
ergibt 'XBCXbc', weil durch das Flag 'i' die Zeichen 'A' und 'a' gleichermaßen gefunden werden.
fn:replace('ABCabc', 'a', 'X')
ergibt dagegen 'ABCXbc', weil ohne Flag die Groß-/Kleinschreibung beachtet wird, also nur das kleine 'a' ersetzt wird.
Flag 'm':
Das Flag 'm' (»multiline«) schaltet die Interpretation des Eingabestrings von Stringmodus (string mode) in Mehrzeilenmodus (multiline mode) um. Mit gesetztem Flag 'm' wird die übergebene Zeichenkette als »mehrzeilig« interpretiert, in ihr enthaltene Zeilenumbruchzeichen #x0A also als Zeilenbegrenzer betrachtet. Dies wirkt sich auf die Wirkung der Metazeichen ^ und $ aus, die Anfang und Ende einer Zeichenkette erkennen: In diesem Fall werden deren Matches auf Zeilenanfang und -ende ausgeweitet:
fn:replace('abc
def', 'abc$', 'XXX', 'm')
ergibt
'XXX
def', weil durch das multiline-Flag der Zeilenumbruch, für den das Metazeichen $ steht, hinter dem Teilstring abc als Zeilenende erkannt wird.
fn:replace('abc
def', 'abc$', 'XXX')
gibt dagegen den Eingangsstring unverändert zurück, da die Zeichenkette in diesem Fall als Ganzes untersucht wird (im Stringmodus). Sie besitzt also für die Funktion nur ein erkennbares Ende, nämlich das Stringende selbst – für dieses findet jedoch kein Match statt.
Reguläre Ausdrücke – Kurzübersicht bei fn:matches():
Eine ausführliche Einführung in reguläre Ausdrücke ist in diesem Buch aus Platzgründen nicht möglich. Eine kurze Übersicht über in regulären Ausdrücken verwendbare Metazeichen und ihre jeweilige Bedeutung befindet sich jedoch bei den Erläuterungen zur Funktion fn:matches().
Achtung – RegExe in XPath sind gegenüber Perl vereinfacht:
Zwar sind reguläre Ausdrücke in XPath weitgehend an die entsprechende Perl-Syntax angelehnt, jedoch gibt es Vereinfachungen und damit Abweichungen. Ein Perl-RegEx lässt sich daher nicht immer wirkungsgleich in XPath einsetzen.
Bildung von Backreferences durch Subgruppenklammern:
Innerhalb des regulären Ausdrucks können Subgruppen durch runde Klammern markiert werden. Die Matches jeder dieser Subgruppen (captured substrings) können wie Variablen behandelt und im Ersetzungsstring referenziert werden.
Hierbei sind nur maximal neun Subgruppen zugänglich. Die Referenz erfolgt mittels der Ausdrücke $1 bis $9 (das $-Zeichen bezieht sich nur auf die unmittelbar folgende Ziffer, daher kann nicht z.B. $10 geschrieben werden).
Existiert zu einer Referenz keine entsprechende Subgruppe oder ergibt eine bezeichnete, existierende n-te Gruppe keinen Match, so wird die entsprechende Subgruppenreferenz $n durch den leeren String ersetzt.
Ist ein Match für zwei sich überlappende Positionen möglich, so wird der erste mögliche Match ausgewählt:
fn:replace("abcd", "(ab)|(a)", "[1=$1][2=$2]")
ergibt "[1=ab][2=]cd".
Hierbei wurde die Variablenreferenz $2 durch den leeren String ersetzt, da für die zweite Gruppe ein Match erfolgt, der mit dem ersten Match überlappt.
Außerhalb von Subgruppenreferenzen kann das $-Zeichen im Ersetzungsstring nur dann als literales Zeichen verwendet werden, wenn ihm als \$ ein Backslash vorangestellt wird. Folglich muss auf ein $-Zeichen ohne vorangestellten Backslash unmittelbar eine der Ziffern 1 bis 9 folgen – andernfalls wird der Fehler »Invalid replacement string« gemeldet (err:FORX0004).
Auch ein einzelner Backslash '\' darf im Ersetzungsstring nicht auftreten – dieser muss stets in der Form '\\' mit einem weiteren Backslash maskiert werden.
Weitere Erläuterungen zu regulären Ausdrücken an anderer Stelle
Weitere Erläuterungen zu regulären Ausdrücken finden Sie bei fn:matches() und bei fn:tokenize().
Beispiele:
Beispiel 1 – Zeichenersetzung mit fn:replace:
fn:replace("abracadabra", "bra", "X")
ergibt "aXcadaX".
Beispiel 2 – Zeichenersetzung mit fn:replace:
fn:replace("abracadabra", "a.*a", "X")
ergibt "X".
Beispiel 3 – Zeichenersetzung mit fn:replace:
fn:replace("abracadabra", "a.*?a", "X")
ergibt "XcXbra".
Beispiel 4 – Zeichenersetzung mit fn:replace:
fn:replace("abracadabra", "a", "")
ergibt "brcdbr".
Die gefundenen Matches werden alle durch den leeren String ersetzt.
Beispiel 5 – Zeichenersetzung mit fn:replace:
fn:replace("abracadabra", "a(.)", "a$1$1")
ergibt "abbraccaddabbra".
Hier enthält der Ersetzungsstring geklammerte Subgruppen. In der Subgruppenvariable $1 steht jeweils ein (beliebiges) auf ein a folgendes Zeichen a(.), das pro Match per $1$1 dementsprechend zweimal ausgegeben wird.
Beispiel 6 – Fehler durch Match auf leeren String:
fn:replace("abracadabra", ".*?", "$1")
erzeugt eine Fehlermeldung, da der Ausdruck .*? auf den leeren String passt.
Funktionsdefinition:
XPath 1.0:
Funktion nicht verfügbar
XPath 2.0:
fn:replace($input as xs:string?,
$pattern as xs:string,
$replacement as xs:string) as xs:string?
fn:replace($input as xs:string?,
$pattern as xs:string,
$replacement as xs:string,
$flags as xs:string) as xs:string?
<< zurück | vor >> |
Tipp der data2type-Redaktion: Zum Thema XSLT bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an: |
Copyright © Galileo Press, Bonn 2008
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "XSLT 2.0 & XPath 2.0 ― Das umfassende Handbuch" denselben Bestimmungen wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.
Galileo Press, Rheinwerkallee 4, 53227 Bonn