[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] RegEx – String auf Float/Integer testen

* http://www.regular-expressions.info/floatingpoint.html
DATA: lv_in TYPE string VALUE '-1.23'. " oder 1.23E-10 oder -1
DATA: lv_out TYPE f.

DATA(matcher) = cl_abap_matcher=>create( pattern = '^[-+]?[0-9]*[.]?[0-9]+([eE][-+]?[0-9]+)?$'
                                         text = lv_in
                                         ignore_case = abap_true ).

IF matcher->match( ) = abap_true.
  lv_out = lv_in.
  WRITE: / lv_out.
ENDIF.

[ABAP] RegEx – String auf Datum testen

* http://www.regular-expressions.info/dates.html
DATA: lv_in TYPE string VALUE '2016-02-01'.

* mm-dd-yyyy, mm/dd/yyyy, mm.dd.yyyy, mm dd yyyy
* '^(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20|21)\d\d$'

* dd-mm-yyyy, dd/mm/yyyy, dd.mm.yyyy, dd mm yyyy
* '^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d$'

* yyyy-mm-dd, yyyy/mm/dd, yyyy.mm.dd, yyyy mm dd
* '^(19|20|21)\d\d([- /.])(0[1-9]|1[012])\2(0[1-9]|[12][0-9]|3[01])$'
DATA(matcher) = cl_abap_matcher=>create( pattern = '^(19|20|21)\d\d([- /.])(0[1-9]|1[012])\2(0[1-9]|[12][0-9]|3[01])$'
                                         text = lv_in
                                         ignore_case = abap_true ).

IF matcher->match( ) = abap_true.
  WRITE: / lv_in.
ENDIF.

[ABAP] RegEx – String auf White-Spaces testen

DATA: lv_txt TYPE string.
  
lv_txt = ...

* White-Spaces:
* - space
* - tab (\t)
* - carriage-return (\r)
* - newline (\n)
* - form-feed (\f)
IF abap_true = cl_abap_matcher=>create( pattern = '^\s*$'
                                        text = lv_txt
                                        ignore_case = abap_true )->match( ).
                                                    
  WRITE: / 'Der String besteht nur aus 0..n White-Spaces. Er ist im Grunde leer.'.
ELSE.
  WRITE: / 'Im String besteht nicht nur aus White-Spaces.'.
ENDIF.