ABAP - Schlüsselwortdokumentation →  ABAP - Referenz →  Interne Daten verarbeiten →  Zeichen- und Bytekettenverarbeitung →  Ausdrücke und Funktionen für die Zeichenkettenverarbeitung →  Reguläre Ausdrücke →  Syntax regulärer Ausdrücke → 

Zeichenfolgenmuster

Zeichenfolgen werden durch Verkettungen oder Operatoren repräsentiert.

Verkettungen

Verkettungen sind gültige reguläre Ausdrücke, die hintereinander geschrieben werden. Sind r und s reguläre Ausdrücke, so stimmt die Verkettung rs mit allen Zeichenfolgen überein, die aus der Verkettung der mit r und s übereinstimmenden Zeichenfolgen gebildet werden können.

Beispiele

Die folgende Tabelle zeigt einige Ergebnisse einer Überprüfung.

Pattern Text match
H[aeu]llo Hallo X
H[aeu]llo Hello X
H[aeu]llo Hullo X
H[aeu]llo Hollo -

Bei H[aeu]llo handelt es sich um die Verkettung von fünf regulären Ausdrücken für Einzelzeichen.

Operatoren für Zeichenfolgen

Diese Operatoren werden aus den Sonderzeichen {, }, *, +, ?, |, (, ) und \ aufgebaut. Die Sonderzeichen können durch das Voranstellen von \ oder das Einschließen in \Q ... \E zu Literalzeichen gemacht werden.

Verkettungsoperatoren

Die Operatoren {n}, {n,m}, *, + und ? (wobei n und m natürliche Zahlen inklusive Null sind) können direkt hinter einen regulären Ausdruck r geschrieben werden und erzeugen dadurch Verkettungen rrr... des regulären Ausdrucks:

Hinweis

Für einen regulären Ausdruck mit Verkettungsoperatoren gilt als primäre Regel, dass möglichst der gesamte Ausdruck passen muss. Diese Regel beschränkt die Länge von Zeichenfolgen, die zu Verkettungen mit den Operatoren * und + passen, und damit deren gieriges Verhalten.

Beispiele

Die folgende Tabelle zeigt einige Ergebnisse einer Überprüfung.

pattern Text match
Hel{2}o Hello X
H.{4} Hello X
.{0,4} Hello -
.{4,} Hello X
.+H.+e.+l.+l.+o.+ Hello -
x*Hx*ex*lx*lx*ox* Hello X
l+ ll X

Beispiel

Der erste Teilausdruck a+ wird mit den ersten 5 Zeichen "aaaaa" aus text abgeglichen während das letzte Zeichen "a" aus text für den zweiten Teilausdruck a vorbehalten bleibt.

DATA TEXT type STRING.
DATA result_tab TYPE match_result_tab.

text = 'aaaaaa'.

FIND ALL OCCURRENCES OF REGEX '(a+)(a)'
     IN text RESULTS result_tab.

Alternativen

Der Operator | kann zwischen zwei reguläre Ausdrücke r und s geschrieben werden und erzeugt dadurch einen einzigen regulären Ausdruck r|s, der sowohl mit r als auch mit s übereinstimmt.

Hinweis

Verkettungen und andere Operatoren binden stärker als |, d.h. r|st und r|s+ sind gleichbedeutend zu r|(?:st) bzw. r|(?:s+) und nicht zu (?:r|s)t bzw. (?:r|s)+.

Beispiele

Die folgende Tabelle zeigt einige Ergebnisse einer Überprüfung.

Pattern Text match
H(e|a|u)llo Hello X
H(e|a|u)llo Hollo -
He|a|ullo Hallo -
He|a|ullo ullo X

Untergruppen

Die Operatoren ( ... ) und (?: ... ) gruppieren Verkettungen von regulären Ausdrücken zu einer Einheit und beeinflussen dadurch den Wirkungsbereich anderer Operatoren wie * oder |, die darauf wirken. Die regulären Ausdrücke (r) und (?:r) stimmen dabei mit dem regulären Ausdruck r überein. Der Unterschied zwischen ( ... ) und (?: ... ) besteht darin, dass der Operator ( ... ) gefundene Teilfolgen in Registern speichert und (?: ... ) nicht.

Hinweis

Das oben erwähnte gierige Verhalten von Verkettungsoperatoren gilt auch für Untergruppen und zwar von links nach rechts. Dabei wird aber nicht die Regel verletzt, dass primär der gesamte reguläre Ausdruck passen muss.

Beispiele

Die folgende Tabelle zeigt einige Ergebnisse einer Überprüfung.

Pattern Text match
Tral+a Tralala -
Tr(al)+a Tralala X
Tr(?:al)+a Tralala X

Im ersten Ausdruck wirkt die Verkettung mit dem Operator + auf das Literalzeichen l, im zweiten und dritten Ausdruck auf die Untergruppe al.

Untergruppen mit Registrierung

Neben seiner Wirkung zur Bildung von Untergruppen speichert der Operator ( ... ) beim Abgleich des regulären Ausdrucks mit einer Zeichenfolge die Teilfolgen, auf welche die Untergruppen ( ... ) des Ausdrucks passen, der Reihe nach in Registern ab. Jeder Untergruppe ist dabei ein Operator \1, \2, \3, ... zugeordnet, der innerhalb des Ausdrucks hinter seiner Untergruppe aufgeführt werden kann und dabei als Platzhalter für die im zugehörigen Register abgelegte Zeichenfolge wirkt. Bei Textersetzungen kann mit den Sonderzeichen $1, $2, $3, ... auf die letzte Belegung der Register zugegriffen werden.

Die Anzahl der Untergruppen und Register ist nur durch die Kapazität der Plattform begrenzt.

Hinweise

Über den Zusatz SUBMATCHES der Anweisungen FIND und REPLACE bzw. die gleichnamige Spalte der mit dem Zusatz RESULTS gefüllten Ergebnistabelle kann auf den Inhalt aller Register einer Fundstelle zugegriffen werden. Die Klasse CL_ABAP_MATCHER enthält hierfür die Methode GET_SUBMATCH.

Wenn ausschließlich gruppiert und keine Teilfolgen in Registern abgespeichert werden soll, kann statt ( ... ) der Operator (?: ... ) verwendet werden. Bezüglich der Bildung von Untergruppen haben beide Operatoren die gleiche Wirkung, (?: ... ) speichert aber nichts in Registern.

Beispiele

Die folgende Tabelle zeigt einige Ergebnisse einer Überprüfung.

Pattern Text match
(["']).+\1 "Hello" X
(["']).+\1 "Hello' -
(["']).+\1 'Hello' X

Die Verkettung (["']).+\1 stimmt mit allen Textfolgen überein, bei denen das erste Zeichen " oder ' ist und das letzte Zeichen gleich dem ersten Zeichen ist. Für die beiden erfolgreichen Überprüfungen enthält das Register die Werte " bzw. '.

Beispiel

Das Beispiel demonstriert das gierige Verhalten des Operators + in Untergruppen und das Zusammenspiel mit der primären Regel, dass möglichst der gesamte reguläre Ausdruck passen muss. Die erste Untergruppe beansprucht möglichst viele Zeichen "a". Ihr werden die ersten 4 Zeichen "aaaa" zugeteilt. Für die beiden anderen Untergruppen verbleibt jeweils noch ein Zeichen "a".

DATA text TYPE string.
DATA result_tab TYPE match_result_tab.

text = 'aaaaaa'.

FIND ALL OCCURRENCES OF REGEX '(a+)(a+)(a+)'
     IN text RESULTS result_tab.

Literalzeichen

Die Operatoren \Q ... \E machen aus allen eingeschlossenen Zeichen eine Zeichenfolge von Literalzeichen, in denen Sonderzeichen keine Wirkung haben.

Die folgende Tabelle zeigt einige Ergebnisse einer Überprüfung.

pattern Text match
.+\w\d Special: \w\d -
.+\\w\\d Special: \w\d X
.+\Q\w\d\E Special: \w\d X

Reservierte Erweiterungen

Die Zeichenfolge (? ... ) ist generell für spätere Spracherweiterungen reserviert und löst mit Ausnahme der derzeit schon unterstützten Operatoren (?:...), (?=...), (?!...) und (?> ... ) die Ausnahme CX_SY_INVALID_REGEX aus.