2[3[a]b] in aaabaaab konvertieren

Vor ein paar Tagen hat ein Mitglied unserer Telegram-Gruppe die Frage gestellt, wie man 2[3[a]b] nach aaabaaab, 2[a]3[b]c nach aabbbc un so weiter konvertieren kann.

Fragestellung und Entscheidung zur Umsetzung:

  1. Wie können wir die richtigen Kombinationen von öffnenden und schliessenden Klammern ermitteln?
    • Hierfür können wir den simplen RegEx (\d{0,})[([^[]]+)] verwenden

Lösung

Ich habe die Logic in eine Klasse implementiert. Zusätzlich habe ich eine entsprechende Unit Test Klasse angelegt, um sicherzustellen, dass die Methode auch noch richtig funktioniert, wenn Änderungen an der Logik vorgenommen werden.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
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

Für den Unit Test habe ich drei Methoden mit verschiedenen Klammerkombinationen, von einfach bis tief verschachtelt.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
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.

Hol Dir den Source von meinem GitHub

Herunterladen

Du kannst den Code entsprechend Deines Releases herunterladen. Verfügbare Versionen sind:

GitHub Repo mit abapGit importieren

Du kannst den Code auch direkt mit abapGit importieren. Nähere Information, wie man den Code mit abapGit importiert, findest Du hier.

Link zum Kopieren https://github.com/stekoester/convert_bracketstring_2_string