Die Funktion substring()
dient dazu, einen Teilstring (einen Abschnitt) aus einem zeichenartigen Datenobjekt (
wie STRING
oder C
) zu extrahieren. Sie gibt den extrahierten Teil als neuen String zurück und verändert die
Originalvariable nicht.
Syntax
Die Funktion wird innerhalb eines ABAP-Ausdrucks aufgerufen:
DATA(result_string) = substring( val = <quelle> [off = <offset>] [len = <laenge>] ).
val = <quelle>
: Das zeichenartige Datenobjekt (TypSTRING
,C
,N
,D
,T
), aus dem der Teilstring extrahiert werden soll.off = <offset>
(Optional): Der Start-Offset (Position) für die Extraktion. Wichtig: Der Offset ist * 0-basiert*, d.h. das erste Zeichen hat den Offset 0, das zweite den Offset 1 usw. Der Wert muss ein nicht-negativer Integer sein. Wennoff
weggelassen wird, wird standardmäßig ab Offset 0 (Anfang) extrahiert.len = <laenge>
(Optional): Die Länge des zu extrahierenden Teilstrings (Anzahl der Zeichen). Der Wert muss ein nicht-negativer Integer sein. Wennlen
weggelassen wird, werden alle Zeichen ab deroff
-Position bis zum Ende der<quelle>
extrahiert.result_string
: Das Ergebnis der Funktion ist immer vom TypSTRING
.
Funktionsweise und Verhalten
- Die Funktion liefert einen String zurück, der die Zeichen aus
<quelle>
ab der Position<offset>
mit der Länge<laenge>
enthält. - Wird
<laenge>
weggelassen, geht die Extraktion bis zum Ende der<quelle>
. - Wenn
<offset>
+<laenge>
über das Ende der<quelle>
hinausgeht, werden nur die verfügbaren Zeichen bis zum Ende zurückgegeben (es gibt keinen Fehler, solangeoffset
selbst gültig ist). - Bei Quellvariablen fester Länge (Typ
C
etc.) werden nachfolgende Leerzeichen als Teil der Zeichenkette betrachtet und können extrahiert werden, wenn sie innerhalb desoff
/len
-Bereichs liegen. - Ungültige Werte für
off
(negativ, größer/gleich der Länge vonval
ermittelt mitstrlen
) oderlen
(negativ) führen in der Regel zu einem Laufzeitfehler (z.B. ExceptionCX_SY_RANGE_OUT_OF_BOUNDS
).
Alternative: Offset-/Längen-Zugriff (+off(len)
)
Eine oft gesehene, kompaktere Syntax ist variable+offset(laenge)
, z. B. teil = text+5(10).
.
- Unterschiede: Diese Syntax versucht, den Datentyp der Originalvariablen beizubehalten, während
substring()
immer einenSTRING
zurückgibt. Das Fehlerhandling kann sich unterscheiden. Die Funktionsubstring()
ist oft robuster und klarer in ihrer Absicht.
Verwandte Funktionen
Es gibt auch Funktionen, die basierend auf Trennzeichen extrahieren: substring_after()
, substring_before()
,
substring_from()
, substring_to()
.
Beispiele
DATA text TYPE string VALUE 'Hallo ABAP Welt!'.DATA teil1, teil2, teil3, teil4 TYPE string.DATA offset TYPE i VALUE 6.DATA length TYPE i VALUE 4.
" 1. Mit Offset und Längeteil1 = substring( val = text off = 6 len = 4 ).WRITE: / '1. Teil (off=6, len=4):', teil1. " Ausgabe: ABAP
" 2. Ab Offset bis zum Ende (len weggelassen)teil2 = substring( val = text off = 11 ).WRITE: / '2. Teil (off=11, Ende):', teil2. " Ausgabe: Welt!
" 3. Vom Anfang bis Länge X (off weggelassen -> Default 0)teil3 = substring( val = text len = 5 ).WRITE: / '3. Teil (Anfang, len=5):', teil3. " Ausgabe: Hallo
" 4. Mit Variablen für Offset/Längeteil4 = substring( val = text off = offset len = length ).WRITE: / '4. Teil (Variablen):', teil4. " Ausgabe: ABAP
" 5. Mit Typ CDATA text_c TYPE c LENGTH 20 VALUE 'Festtext '. " 11 Zeichen + 9 LeerzeichenDATA teil_c TYPE string.teil_c = substring( val = text_c off = 9 len = 5 ). " Extrahiert 'xt' + 3 LeerzeichenWRITE: / '5. Teil (Typ C):', |'{ teil_c }'|. " Ausgabe: '{xt }'
" 6. Vergleich mit Offset-ZugriffDATA teil_via_offset TYPE string.teil_via_offset = text+6(4). " Äquivalent zu Beispiel 1WRITE: / 'Vergleich (+off(len)):', teil_via_offset. " Ausgabe: ABAP
Wichtige Hinweise / Best Practice
substring()
ist eine Funktion, die einen neuen String zurückgibt und das Original nicht verändert.- Der Offset (
off
) ist 0-basiert. - Die Funktion ist relativ fehlertolerant bezüglich der Länge (
len
), aber nicht bezüglich des Offsets (off
). - Sie ist eine klare und sichere Methode, um Teilstrings zu extrahieren, besonders wenn das Ergebnis vom Typ
STRING
sein soll.