Code: Alles auswählen.
INITIALIZATION.
PARAMETERS: p_string TYPE string.
START-OF-SELECTION.
DATA:
lv_regex TYPE string VALUE '(?(?=\d{12})(^\d[^58]\d{10}$)|(^\w{5,16}$))'.
FIND REGEX lv_regex IN p_string.
* TRY.
* lv_success = cl_abap_matcher=>matches(
* pattern = lv_regex
* text = p_string
** ignore_case = ABAP_FALSE
** simple_regex = ABAP_FALSE
** no_submatches = ABAP_FALSE
* ).
* CATCH cx_sy_regex. " System Exceptions für reguläre Ausdrücke
* WRITE 'ERROR'.
* ENDTRY.
IF sy-subrc EQ 0.
WRITE / 'found'.
ELSE.
WRITE / 'not found'.
ENDIF.
Wenn ich den REGEX mal hier eingebe https://regex101.com/ funktioniert der.Was ist passiert?
Fehler im ABAP-Anwendungsprogramm.
Das laufende ABAP-Programm "ZZTEST" mußte abgebrochen werden, da es auf eine Anweisung gestoßen ist, die leider nicht ausgeführt werden kann.
Der angegebene Ausdruck "(?(?=\d{12})(^\d[^58]\d{10}$)|(^\w{5,16}$))" ist kein gültiger regulärer Ausdruck oder kann im gegebenen Kontext nicht verarbeitet werden. Der Fehler trat an Zeichenoffset 2 auf.
Was soll denn das "(?" überhaupt bewirken? Laut einer schnellen Recherche ist das für "benannte Gruppen" oder "Inline Modifier" reserviert.ABAP Hilfe hat geschrieben:(? ... ) Reserviert für spätere Erweiterungen
Regex ABAP ist nicht gleich Regex allgemein. Zum Testen eines regulären Ausdrucks in ABAP kannst du den von SAP ausgelieferten Report DEMO_REGEX_TOY verwenden.nickname8 hat geschrieben:Wenn ich den REGEX mal hier eingebe https://regex101.com/ funktioniert der.
Super, danke! Ich weiß, dass ABAP-REGEX NE "normaler" REGEX. Auf der Webseite ist der nur etwas interaktiver zu testen.black_adept hat geschrieben:Regex ABAP ist nicht gleich Regex allgemein. Zum Testen eines regulären Ausdrucks in ABAP kannst du den von SAP ausgelieferten Report DEMO_REGEX_TOY verwenden.
Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
nickname8
Computer sagt nein.a-dead-trousers hat geschrieben:So sollte es funktionieren:
(^\d[^58]\d{10}$)|(^\w{5,16}$)
Kennst du auch das eine Mal wo der Computer "Ja" sagt.nickname8 hat geschrieben:Computer sagt nein.
Leider ist dann bei einem alphanumerischen String an der 2. Stelle weder 5 noch 8 erlaubt. Diese Ausnahme soll aber nur bei einem numerischen String der Länge 12 gelten.
Sonst soll alles erlaubt werden.
Dele hat geschrieben:Kannst du mal bitte folgenden Ausdruck probieren:
(\A\d[01234679]\d{10}\Z)|(\A(?!(\d{12}\Z))[\w]{5,16}\Z)
bzw.
(^\d[01234679]\d{10}$)|(^(?!(\d{12}$))[\w]{5,16}$)
Der Vorteil bei RegEx ist, dass ich das in eine Konfigurationstabelle schreiben kann und die im Live-System anpassen kann. Der Kontext hier ist die Prüfung von Serialnummern.black_adept hat geschrieben:@nickname: Ich bin ja ein großer Fan von regulären Ausdrücken - aber ich fürchte, dass in deinem Fall ein einziger RegEx nachher nicht mehr wirklich elegant aussehen wird. Vorschlag für diesen speziellen Fall: Die Abtrennung der Sonderbedingung mittels klassischem ABAP ( IF...ELSEIF.. ). Danach dann jeweils über reguläre Ausdrücke weiterverfahren oder vollständig klassisch bleiben wie Wolfgang vorgeschlägt.
https://de.wikipedia.org/wiki/Law_of_the_Instrument