[ABAP] In internen Tabellen suchen

Variante 1 (Teilstrings in String suchen)

DATA(lv_string) = |ABAP_ABAP|.
DATA(lv_search) = |BA|.

FIND ALL OCCURRENCES OF lv_search
  IN lv_string
  IGNORING CASE             " case insensitive
  RESULTS DATA(it_results). " TYPE match_result_tab

IF sy-subrc = 0.
  LOOP AT it_results ASSIGNING FIELD-SYMBOL(<r>).
    WRITE: / substring( val = lv_string off = <r>-offset len = <r>-length ).
  ENDLOOP.
ENDIF.

Variante 2 (erstes Auftreten eines String in der Liste)

DATA(it_strings) = VALUE stringtab( ( |ACCESS=true| )
                                    ( |SERVER_NAME='myserver'| )
                                    ( |SERVER_TIMEOUT=600| )
                                    ( |TOKEN='auzt76wwhbud8w8hs8'| ) ).

* erstes Auftreten des Teilstrings 'SERVER_' ermitteln, case-sensitive Suche
FIND FIRST OCCURRENCE OF SUBSTRING 'SERVER_'
  IN TABLE it_strings
  RESPECTING CASE          " case-sensitive
  MATCH LINE DATA(idx)     " Index
  MATCH OFFSET DATA(off)   " Offset
  MATCH LENGTH DATA(len).  " Länge

IF sy-subrc = 0.
  WRITE: / off.
  WRITE: / len.
  WRITE: / it_strings[ idx ].
ENDIF.

Variante 3 (alle gefundenen Strings in der Liste)

DATA(it_strings) = VALUE stringtab( ( |ACCESS=true| )
                                    ( |SERVER_NAME='myserver'| )
                                    ( |SERVER_TIMEOUT=600| )
                                    ( |TOKEN='auzt76wwhbud8w8hs8'| ) ).

FIND ALL OCCURRENCES OF SUBSTRING 'SERVER_'
  IN TABLE it_strings
  RESPECTING CASE           " case-sensitive
  RESULTS DATA(it_results). " Ausgabetabelle

IF sy-subrc = 0.
  LOOP AT it_results ASSIGNING FIELD-SYMBOL(<r>).
    WRITE: / it_strings[ <r>-line ], <r>-offset, <r>-length.
  ENDLOOP.
ENDIF.

Variante 4 (RegEx: alle gefundenen Strings in der Liste)

DATA(it_strings) = VALUE stringtab( ( |ACCESS=true| )
                                    ( |SERVER_NAME='myserver'| )
                                    ( |SERVER_TIMEOUT=600| )
                                    ( |TOKEN='auzt76wwhbud8w8hs8'| ) ).

* Alle Auftreten der Suchbegriffe NAME und TIMEOUT
FIND ALL OCCURRENCES OF REGEX 'NAME|TIMEOUT'
  IN TABLE it_strings
  RESPECTING CASE           " case-sensitive
  RESULTS DATA(it_results). " Ausgabetabelle

IF sy-subrc = 0.
  LOOP AT it_results ASSIGNING FIELD-SYMBOL(<r>).
    WRITE: / it_strings[ <r>-line ], <r>-offset, <r>-length.
  ENDLOOP.
ENDIF.

Links

[ABAP] RegEx – Hausnummern und Straßennamen aus String filtern

* https://regex101.com/

* Straße des 17. Juni 100/a
* Hauptstrasse 22-1
* Kleiner Weg 3
* Berliner Strasse 22 - 24 A
* Hermann-Weise-Weg 11b

DATA: lv_in TYPE string VALUE 'Straße des 17. Juni 100/a'.

* suchen nach Hausnummern in String
DATA(matcher) = cl_abap_matcher=>create( pattern = '\s[0-9]{1,}[\/ \-0-9a-zA-Z]*'
                                         text = lv_in
                                         ignore_case = abap_true ).

* Tabelle mit Suchergebnissen
DATA(it_matches) = matcher->find_all( ).

IF NOT it_matches IS INITIAL.
* der letzte Eintrag sollte die Hausnummer sein
  DATA(lv_last_entry) = it_matches[ lines( it_matches ) ].

* Straße
  WRITE: / substring( val = lv_in
                      off = 0
                      len = lv_last_entry-offset ).

* Hausnummer
  WRITE: / substring( val = lv_in
                      off = lv_last_entry-offset + 1
                      len = lv_last_entry-length - 1 ).
ENDIF.

[ABAP] RegEx – Postleitzahl (PLZ) und Ort aus String filtern

* https://regex101.com/

* 12345 Berlin
* D12345 Berlin
* D-12345 Berlin
* D 12345 Berlin
* d12345 Berlin
* d-12345 Berlin
* d 12345 Berlin
* D-12345 Berlin-Tegel
* D-12345 Berlin (Bezirk Tegel)

DATA: lv_in TYPE string VALUE 'D-12345 Berlin (Bezirk Tegel)'.

DATA(matcher) = cl_abap_matcher=>create( pattern = '^(?:[Dd][- ]?)?\d{5}\s'
                                         text = lv_in
                                         ignore_case = abap_true ).

DATA(it_matches) = matcher->find_all( ).

IF NOT it_matches IS INITIAL.
* der erste Eintrag sollte die PLZ sein
  DATA(lv_plz) = it_matches[ 1 ].

* PLZ
  WRITE: / substring( val = lv_in
                      off = lv_plz-offset
                      len = lv_plz-length - 1 ).

* Ort
  WRITE: / substring( val = lv_in
                      off = lv_plz-length
                      len = strlen( lv_in ) - lv_plz-length ).
ENDIF.

[ABAP] Passwort generieren

PARAMETERS: p_length TYPE i DEFAULT 20. " Passwortlänge
PARAMETERS: p_alpha TYPE string LOWER CASE DEFAULT 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_'. " Passwortzeichensatz
  
START-OF-SELECTION.
  DATA: lv_pw TYPE string.
  DATA(r_sel) = cl_abap_random_int=>create( seed = cl_abap_random=>seed( ) min = 0 max = strlen( p_alpha ) - 1 ).

  DO p_length TIMES.
    lv_pw = |{ lv_pw }{ substring( val = p_alpha off = r_sel->get_next( ) len = 1 ) }|.
  ENDDO.

  WRITE: / 'Passwort: ', lv_pw.

[ABAP] Substrings

* alte Variante
DATA: tel TYPE string.
DATA: vor TYPE string.

tel = '+49-(0)1234-556677'.
vor = tel+0(3). " -> '+49' (name+start(length))

tel+1(2) = '42'. " '49' durch '42' im String ersetzen

WRITE: / tel.
WRITE: / vor.

* neu ab 7.02
res = substring( val = 'ABCDEFGH' off = 3 len = 4 ).    " DEFG
res = substring_from( val = 'ABCDEFGH' sub = 'DEF' ).   " DEFGH
res = substring_after( val = 'ABCDEFGH' sub = 'DEF' ).  " GH
res = substring_before( val = 'ABCDEFGH' sub = 'DEF' ). " ABC
res = substring_to( val = 'ABCDEFGH' sub = 'DEF' ).     " ABCDEF