Logik

2[3[a]b] in aaabaaab konvertieren

Dieser Beitrag zeigt, wie sich komprimierte Bracket-Strings wie 2[3[a]b] in ABAP schrittweise in ihre expandierte Form aaabaaab konvertieren lassen – mittels einer iterativen RegEx-basierten Logik mit match, replace und der repeat-Funktion sowie vollständiger Unit-Test-Abdeckung.

Fragestellung und Entscheidung zur Umsetzung

Die zentrale Herausforderung liegt darin, verschachtelte Klammerstrukturen mit vorangestellten Wiederholungsfaktoren korrekt zu identifizieren und schrittweise von innen nach außen aufzulösen. Die Entscheidung fiel auf einen iterativen Ansatz mit einem regulären Ausdruck, der in jeder Runde die innerste Ebene erfasst und deren Multiplikation ausführt. Der verwendete RegEx (\d{0,})\[([^\[\]]+)\] findet die tiefste nicht verschachtelte Klammerkombination und ermöglicht so eine wiederholte Reduktion des Strings bis zur vollständig expandierten Form.

Lösung

Die Umsetzung erfolgt in einer eigenständigen ABAP-Klasse. Der Algorithmus arbeitet in einer DO-Schleife, die solange durchläuft, bis keine weiteren Muster mehr gefunden werden. In jedem Durchlauf ermittelt match die innerste Klammerebene, substring_before und substring_after extrahieren den Wiederholungsfaktor sowie den Inhalt, und replace kombiniert beides mit der repeat-Funktion zur expandierten Zeichenfolge. Eine zusätzliche Unit-Test-Klasse stellt sicher, dass die Logik auch bei späteren Änderungen verlässlich arbeitet.

Lösung anzeigen (17 Zeilen)
METHOD convert_bracketstring.
  rv_value = iv_value.
  DO.
    DATA(lv_match) = match( val = rv_value regex = '(\d{0,})\[([^\[\]]+)\]' ).
    IF lv_match IS INITIAL.
      EXIT.
    ENDIF.
    DATA(lv_repeat_times) = substring_before( val = lv_match sub = '[' ).
    rv_value = replace( val = rv_value
                        regex = '(\d{0,})\[([^\[\]]+)\]'
                        with = repeat( val = substring_before( val = substring_after( val = lv_match
                                                                                      sub = '[' )
                                                               sub = ']' )
                                       occ = CONV i( substring_before( val = lv_match
                                                                       sub = '[' ) ) ) ).
  ENDDO.
ENDMETHOD.

Unit Test

Die Unit-Test-Klasse enthält drei Methoden, die unterschiedliche Komplexitätsstufen der Bracket-Struktur abdecken: einfache flache Blöcke (test_get_value_normal), eine zweistufige Verschachtelung (test_get_value_nested) sowie eine mehrstufig tief verschachtelte Kombination (test_get_value_deepnested). Damit wird sichergestellt, dass der Algorithmus sowohl bei einfachen als auch bei komplex verschachtelten Eingaben korrekt expandiert.

Unit Test anzeigen (14 Zeilen)
METHOD test_get_value_normal.
  cl_abap_unit_assert=>assert_equals( act = zcl_kco_bracketstr2str=>convert_bracketstring( '1[a]2[b]3[c]4[d]' )
  exp = 'abbcccdddd' ).
ENDMETHOD.

METHOD test_get_value_nested.
  cl_abap_unit_assert=>assert_equals( act = zcl_kco_bracketstr2str=>convert_bracketstring( '2[3[a]b]' )
  exp = 'aaabaaab' ).
ENDMETHOD.

METHOD test_get_value_deepnested.
  cl_abap_unit_assert=>assert_equals( act = zcl_kco_bracketstr2str=>convert_bracketstring( '1[2[3[c]a]4[a]b]' )
  exp = 'cccacccaaaaab' ).
ENDMETHOD.

Unit Test Ergebnis

Alle drei Testmethoden laufen erfolgreich durch. Die Abdeckungsmessung (Code Coverage) zeigt für die Methode CONVERT_BRACKETSTRING eine vollständige Abdeckung von 100%. Das bedeutet, dass jeder Ausführungszweig der Implementierung durch mindestens einen Testfall durchlaufen wird. EinCoverage-Wert unter 100% wäre ein Hinweis darauf, dass einzelne Pfade – etwa Grenzfälle ohne Klammern oder mit leeren Inhalten – noch nicht abgedeckt sind und zusätzliche Testmethoden erfordern würden.

Es ist auch gut zu erkennen, dass bei der Abdeckungsmessung 100% der Methode durchlaufen wird. Sollte bei der nicht 100% erreicht werden, könnte man darüber nachdenken, ob noch weitere Testmethoden implementiert werden können, um eine 100%ige Abdeckung zu erlangen.

Quellcode auf GitHub herunterladen

Wähle die passende Variante für Dein SAP-Release.

Mindestrelease GitHub
SAP_BASIS 700 Repository öffnen
SAP_BASIS 702 Repository öffnen
SAP_BASIS 740 Repository öffnen
SAP_BASIS 740SP08 Repository öffnen

GitHub Repo mit abapGit importieren

Anleitung zum Import mit abapGit öffnen

Repository-URL zum Kopieren

https://github.com/stekoester/convert_bracketstring_2_string

Zurück zur Blog-Übersicht