ABAP

Reguläre Ausdrücke mit ABAP

Von 29. Oktober 2017Februar 16th, 2020Keine Kommentare

Reguläre Ausdrücke in ABAP waren für mich bis vor ein paar Tagen ein Buch mit sieben Siegeln. Ich wusste im Grunde genommen, wofür sie verwendet wurden, hatte aber noch nie mit ihnen gearbeitet. Mit dem Schwerpunkt auf den Customer Experience-Lösungen von SAP arbeite ich selten in ABAP, aber ich möchte Ihnen meine Herangehensweise an das Thema an einem Beispiel zeigen. Ich hoffe, dass diese Informationen Ihnen den Einstieg in das Thema erleichtern.

Reguläre Ausdrücke mit ABAP

Was sind reguläre Ausdrücke?

Zunächst einmal: Was sind überhaupt reguläre Ausdrücke? Eine Suche bei Google führt uns zu der folgenden Beschreibung bei Wikipedia:

Ein regulärer Ausdruck (englisch regular expression, Abkürzung RegExp oder Regex) ist in der theoretischen Informatik eine Zeichenkette, die der Beschreibung von Mengen von Zeichenketten mit Hilfe bestimmter syntaktischer Regeln dient. Reguläre Ausdrücke finden vor allem in der Softwareentwicklung Verwendung. Neben Implementierungen in vielen Programmiersprachen verarbeiten auch viele Texteditoren reguläre Ausdrücke in der Funktion „Suchen und Ersetzen“. Ein einfacher Anwendungsfall von regulären Ausdrücken sind Wildcards.

WikipediaDie freie Enzyklopädie

Nicht wirklich verständlich? Dann hilft Ihnen vielleicht das folgende Video:

Einfach gesagt, ist ein regulärer Ausdruck ein Suchmuster für Zeichenketten. Sie können einen regulären Ausdruck verwenden, um beispielsweise einen bestimmten Teil eines Textes zu finden.

Beispiel für reguläre Ausdrücke mit ABAP

Aufgabenstellung

Zur Veranschaulichung der Anwendung arbeiten wir an folgendem Beispiel:
Es besteht die Anforderung, die verlinkten URLs aus einem HTML-Dokument zu lesen.

Dieses Dokument könnte sehr vereinfacht wie folgt aussehen, die gesuchten Komponenten sind die YouTube-URLs in den Zeilen 2 und 3:

Erste Schritte

Ich wusste, dass solche Anforderungen mit regulären Ausdrücken gelöst werden können, aber ich wusste nicht, wie reguläre Ausdrücke aussehen.

Bei meiner Suche stieß ich auf eine Website, die den Umgang mit solchen Anforderungen und regulären Ausdrücken extrem einfach und zugänglich machte. Und ich denke, sie hilft auch Ihnen. Die Website heißt RegExr und ist ein Online-Werkzeug, um reguläre Ausdrücke zu erstellen, zu testen und von ihnen zu lernen. Sie finden die Website  hier.

Beginnen wir also mit dem Beispiel, indem wir den oberen Text in RegExr einfügen:

Der verwendete reguläre Ausdruck
Der verwendete Beispieltext an dem der reguläre Ausdruck getestet werden soll
Einige Tools, z.B. eine Erklärung des regulären Ausdrucks
Die Navigationsleiste
Die Anzahl der gefundenen regulären Ausdrücke

Wie man an den farblich hervorgehobenen Bestandteilen erkennt, erfüllt der derzeit im Tool eingetragene reguläre Ausdruck ([A-Z]) nicht unsere Anforderungen. Er findet alle großgeschriebenen Buchstaben. Wir möchten URLs innerhalb des HTML <a> Tags finden.

Beginnen sollten wir mit der in der Navigationsleiste zu findenden Referenz und dem Cheatsheet in denen wir die Befehle und deren Bedeutung nachschlagen können – was in der Kombination mit dem Hervorheben der gefundenen Beispiele in Echtzeit auch Laien das bauen eines regulären Ausdrucks ermöglicht.

In meinem ersten Versuch baute ich nur mit Hilfe der Markierungen folgenden regulären Ausdruck:

Das Ergebnis sieht zunächst so aus, als sei dies bereits die Lösung unserer Anforderung.

Es wurden wie erwartet zwei Ergebnisse gefunden
Der genutzte reguläre Ausdruck
Die markierten Textstellen wurden gefunden

Wir sind in diesen Testdaten davon ausgegangen, dass der Anwender immer so vorgeht wie erwartet, und das jederzeit nur http bzw. https genutzt wird, und kein mailto oder ftp.

Prüfen wir also den regulären Ausdruck noch einmal mit den folgenden erweiterten Testdaten.

Es werden 5 Ergebnisse gefunden
Der ebenfalls vorher genutzte reguläre Ausdruck
Eine URL in Anführungszeichen, aber kein HTML-Link. Ist als Ergebnis nicht gewünscht.
Eine URL ohne Anführungszeichen, aber kein HTML-Link. Ist als Ergebnis nicht gewünscht und gibt eine zu große Ergebnismenge zurück.

Anhand der blau markierten Bereiche können wir sehen, dass das der reguläre Ausdruck für unsere Anforderung noch nicht ausreichend ist.

Die Anforderung besteht weiterhin daraus, dass nur die beiden grün markierten Bestandteile in den hervorgehobenen Zeilen gefunden werden.

Wir sollten uns also die genauere Bedeutung der Bestandteile unseres regulären Ausdrucks anschauen.

[^“]* = Beliebig viele Zeichen, die keine Anführungszeichen sind.
\. = Ein Punkt
[a-z]{2,4} = Zwei bis vier Zeichen, von a bis z. Also zwei bis vier kleine Buchstaben.
(\/[^“]*)? = Eine Gruppierung von Zeichen. Diese darf maximal einmal vorkommen. Die Gruppierung besteht aus einem /, gefolgt von beliebig vielen Zeichen, die keine Anführungszeichen sind.

Unser regulärer Ausdruck sucht also nach Zeichenketten die folgende Eigenschaften erfüllen:
Sie beginnt mit einer beliebigen Anzahl von Zeichen, die keine Anführungszeichen sind. Auf diese folgt ein Punkt. Dem Punkt folgen zwei bis vier kleine Buchstaben.
Daraufhin darf maximal einmal ein /, gefolgt von einem oder mehr Zeichen, außer einem Anführungszeichen, folgen.

Wie man an der Erklärung sieht, kann dieser reguläre Ausdruck wesentlich mehr Bestandteile finden, die in unserer Anforderung nicht gewünscht sind. So würden Beispielsweise auch in der Zeichenkette <a href=“ftp://xyz“>FTP?</a> der Ausdruck ftp://xyz gefunden werden.

Wir müssen unseren regulären Ausdruck also so anpassen, dass er die ungewünschten Ergebnisse nicht mehr findet.

Dabei müssen wir uns an die technischen Möglichkeiten der jeweiligen Systeme anpassen. Eine Möglichkeit zur Einschränkung der Ergebnisse wäre ein positive lookbehind, welches Beispielsweise mit (?<=href=“) ausdrücken würde, dass ein href=“ dem Suchergebnis vorangestellt sein muss, dieses aber nicht im Ergebnis inkludiert ist.

Da weder RegExr, noch ABAP positive lookbehind unterstützen müssen wir uns hier eine andere Möglichkeit überlegen.

Ein Lösungsansatz ist der folgende reguläre Ausdruck

Dieser reguläre Ausdruck sucht nach einer Zeichenfolge, die mit http oder https beginnt. Darauf folgen beliebig viele Zeichen, auf die ein Punkt folgt. Nach diesem Punkt folgen ein oder mehr Buchstaben. Auf die Buchstaben darf maximal einmal eine Gruppe aus einem /, sowie beliebig vielen Zeichen außer Anführungszeichen und Leerzeichen bzw. Zeilenumbrüchen folgen. Nach dem Ergebnis muss sowohl ein beliebiger Inhalt folgen, der mit </a> endet, als auch ein Anführungszeichen. Diese sind jedoch nicht Teil des Ergebnisses.

Der Unterschied der regulären Ausdrücke wird sehr deutlich, wenn man beide mit etwas umfangreicheren Daten testet.

Der vorherige reguläre Ausdruck ist vollständig sichtbar, wenn der Schieberegler nach ganz links geschoben ist. Der neue Ausdruck ist vollständig sichtbar, wenn der Schieberegler nach ganz rechts geschoben ist.

Nun müssen wir noch prüfen ob sich dieser reguläre Ausdruck auch in ABAP nutzen lässt und sich dort auch wie erwartet verhält.

Eine Möglichkeit für solche Tests ist das Programm DEMO_REGEX_TOY. Dieses lässt sich wie gewohnt über die Transaktionen SE38 oder SE80 aufrufen.

Der genutzte reguläre Ausdruck
Einstellungsmöglichkeiten
Der Text an dem der reguläre Ausdruck getestet werden soll
Das Ergebnis

Wie man an den Ergebnissen erkennt, funktioniert der reguläre Ausdruck in diesem Testwerkzeug nicht reibungslos.

Es ist nun zu prüfen, wie sich der reguläre Ausdruck im geplanten Einsatzumgebung verhält. Ein Test an den erwarteten Daten mit der genutzten Methode ist zu empfehlen.

Dies führt jedoch für diese kurze Einführung zu weit und wir werden an dieser Stelle mit dem Beispiel pausieren.

Zusammenfassend empfehle ich also folgende herangehensweise:

Suchen

Zunächst würde ich oberflächlich nach der Anforderung und dem Themengebiet suchen. Unter Umständen findet man bereits einen Ansatz oder eine Lösung. Selbst falls dies nicht der Fall ist erhält man bereits einen groben Überblick über das Thema. In diesem Fall habe ich zunächst ganz allgemein nach regulären Ausdrücken gesucht. Dabei bin ich auf die erwähnte Seite RegExr gestoßen, welche im Folgenden mein Ausgangspunkt wurde. Dort konnte ich mir auch anhand der Community Beiträge einen Überblick über den Aufbau von anderen regulären Ausdrücken machen.

Prototyp

Daraufhin würde ich aus dem bisher gesammelten Wissen einen Prototypen erstellen. Dies war in diesem Fall der erste reguläre Ausdruck, der noch recht rudimentär und schnell erstellt war.

Testen

Der jeweilige Stand des Prototypen ist dann zu testen.und es ist zu prüfen ob dieser bereits die Anforderung oder Teile der Anforderung abdeckt. Wie im Beitrag erwähnt konnte der erste Prototyp schon einige Anforderungen erfüllen, war aber an anderen Stellen noch unscharf. Er konnte also noch nicht als endgültige Lösung verwendet werden.

Anpassen

Aus den Informationen der vorherigen Schritte oder anderer Quellen ist der Prototyp anzupassen. Aus den aufgetretenen Fehlern wurden die Notwendigkeiten zur Anpassung deutlich. Also habe ich den ersten Ausdruck solange angepasst, bis ich zur bisherigen Lösung kam.

Finalisieren

Diese Schritte sind zu wiederholen, bis man mit dem Ergebnis zufrieden ist und die unter Umständen vorher beinhalteten Ungenauigkeiten angepasst wurden.

Dies war für mich der letzte angegebene reguläre Ausdruck. Dieser war zwar noch nicht perfekt, aber für den bisherigen Zweck geeignet. Sollten jedoch bisher nicht beachtete Ungenauigkeiten auftreten, so ist eine erneute Anpassung notwendig.

Weiterführende Informationen zu ABAP RegEx

Eine erste weitere Quelle ist die Dokumentation auf den SAP Help Seiten. In den weiteren Informationen findest du Angaben zur Syntax und ähnliches.

Falls die Dokumentation nicht ausreicht könnten zwei ältere Dokumente weiterhelfen. Das sind ein Dokument zur Verarbeitung regulärer Ausdrücke mit ABAP und eine Präsentation zum Thema.

Neuere Quellen habe ich bei meiner damaligen Recherche zu regulären Ausdrücken mit ABAP leider nicht gefunden. Falls du eine Quelle kennst die ich ergänzen sollte kannst du dich gerne melden.

Wäre es schlecht, uns einfach eine Nachricht zu hinterlassen, wenn du eine Frage hast?

Hinterlasse einen Kommentar