REGEX - CX_SY_INVALID_REGEX

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
14 Beiträge • Seite 1 von 1
14 Beiträge Seite 1 von 1

REGEX - CX_SY_INVALID_REGEX

Beitrag von nickname8 (Specialist / 134 / 17 / 19 ) »
Hallo,

ich versuche ein REGEX zu nutzen, aber leider bricht es mit einem DUMP ab.

Quellcode sieht wie folgt aus:

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.
Der Regex lautet: (?(?=\d{12})(^\d[^58]\d{10}$)|(^\w{5,16}$))
Im Quellcode hier wird das nicht richtig angezeigt.

Der Dump sagt:
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.
Wenn ich den REGEX mal hier eingebe https://regex101.com/ funktioniert der.

Eine Idee was ich alternativ nutzen kann?

LG

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: REGEX - CX_SY_INVALID_REGEX

Beitrag von a-dead-trousers (Top Expert / 4274 / 213 / 1140 ) »
Hi!

Zum (meinem) besseren Verständnis splitte ich hier die RegEx nur mal kurz auf:
Du suchst nach einer beliebiegen Ziffer am Zeilenanfang, gefolgt von NICHT 5 oder 8 und zehn weiteren Ziffern und dem Zeilenende
ODER
Einer beliebigen, alphanumerischen Zeichenkette der Länge 5 bis 16 in einer Zeile (vom Zeilenanfang bis zum Zeilenende)
ABER
Das Ganze soll nur dann auftreten, wenn davor (in der Zeile davor?) 12 Ziffern stehen.
(Die Reihenfolge der Vorausschaubedingung und des ODER-Operators mal außer acht gelassen, weil ich immer vergesse was stärker zieht :wink: )

Der Fehler ist, wie auch schon die Fehlermeldung anzeigt, das "(?".
ABAP Hilfe hat geschrieben:(? ... ) Reserviert für spätere Erweiterungen
Was soll denn das "(?" überhaupt bewirken? Laut einer schnellen Recherche ist das für "benannte Gruppen" oder "Inline Modifier" reserviert.

lg ADT
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: REGEX - CX_SY_INVALID_REGEX

Beitrag von black_adept (Top Expert / 3943 / 105 / 886 ) »
nickname8 hat geschrieben:Wenn ich den REGEX mal hier eingebe https://regex101.com/ funktioniert der.
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.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: REGEX - CX_SY_INVALID_REGEX

Beitrag von nickname8 (Specialist / 134 / 17 / 19 ) »
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.
Super, danke! Ich weiß, dass ABAP-REGEX NE "normaler" REGEX. Auf der Webseite ist der nur etwas interaktiver zu testen.

Re: REGEX - CX_SY_INVALID_REGEX

Beitrag von nickname8 (Specialist / 134 / 17 / 19 ) »
Hier ist grade eine Antwort verloren gegangen:
Ich möchte einen Regex haben, der folgendes macht:
Wenn der string 12stellig ist und numerisch, dann darf an 2. Stelle weder 5 noch 8 stehen. Sonst darf es ein alphanumerischer string sein, der 5 bis 16 Stellen lang ist.
Mit dem ? kann man eine Bedingung ausdrücken: https://www.regular-expressions.info/conditional.html

Re: REGEX - CX_SY_INVALID_REGEX

Beitrag von a-dead-trousers (Top Expert / 4274 / 213 / 1140 ) »
Dann lass das Conditional mit der Vorausschaubedingung doch einfach weg.
Das (^\d[^58]\d{10}$) beschreibt ja schon eine zwölfstellige Zahl.

So sollte es funktionieren:
(^\d[^58]\d{10}$)|(^\w{5,16}$)

Wenn es trotzdem nichts findet, liegt es meiner Erfahrung nach an den ^ und $ (Anfang und Ende). Die sind in ABAP nicht immer so ganz klar definiert. (Leerzeichen am Anfang/Ende von Strings bzw. Zeichenfolgen mit fixer Länge usw.)

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
nickname8

Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: REGEX - CX_SY_INVALID_REGEX

Beitrag von nickname8 (Specialist / 134 / 17 / 19 ) »
a-dead-trousers hat geschrieben:So sollte es funktionieren:
(^\d[^58]\d{10}$)|(^\w{5,16}$)
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.

Re: REGEX - CX_SY_INVALID_REGEX

Beitrag von a-dead-trousers (Top Expert / 4274 / 213 / 1140 ) »
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.
Kennst du auch das eine Mal wo der Computer "Ja" sagt. :D :D :D

Probiers mal so:
(?=\d{12})(^\d[^58]\d{10}$)|(^\w{5,16}$)
ODER
(?:(?=\d{12})(^\d[^58]\d{10}$))|(^\w{5,16}$)

Das (?: ... ) dient nur zu Gruppierung des ersten Teils, da ich mir wegen der Operatorreihefolge nicht ganz sicher bin. Das ?: bedeutet in diesem Fall, dass im Ergebnis keine "Untergruppe" angelegt werden soll.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: REGEX - CX_SY_INVALID_REGEX

Beitrag von a-dead-trousers (Top Expert / 4274 / 213 / 1140 ) »
Die Vorausschaubedingung sollte uU auch die Ankerzeichen beinhalten :wink:
(?=^\d{12}$)
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: REGEX - CX_SY_INVALID_REGEX

Beitrag von nickname8 (Specialist / 134 / 17 / 19 ) »
Leider immer noch nicht.

1)
SE38 --> DEMO_REGEX_TOY
Regex: (?=^\d{12}$)(^\d[^58]\d{10}$)|(^\w{5,16}$)
Text: 151111111111
Matches: 151111111111 (falsch, sollte ja nicht finden, weil 5 an 2. Stelle von numerisch)

2)
Regex: (?:(?=^\d{12}$)(^\d[^58]\d{10}$))|(^\w{5,16}$)
Text: 151111111111
Matches: 151111111111 (falsch, sollte ja nicht finden, weil 5 an 2. Stelle von numerisch)

Wenn ich bei 2) den : weglasse, dann habe ich meinen (nicht in ABAP funktionierenden) RegEx wieder...

Danke bisher für alle Antworten!!!

Re: REGEX - CX_SY_INVALID_REGEX

Beitrag von Dele (Specialist / 307 / 4 / 47 ) »
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}$)

Re: REGEX - CX_SY_INVALID_REGEX

Beitrag von wreichelt (Top Expert / 1031 / 29 / 188 ) »
Hallo,

muss es Regex sein ?
W_LEN = STRLEN( P_STR ). " Space after ( and before )

If p_str co ´0123456789´.
IF p_str+1(1) = ´5´ Or ´8´.
........


Gruß Wolfgang

Re: REGEX - CX_SY_INVALID_REGEX

Beitrag von black_adept (Top Expert / 3943 / 105 / 886 ) »
@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
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: REGEX - CX_SY_INVALID_REGEX

Beitrag von nickname8 (Specialist / 134 / 17 / 19 ) »
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}$)

Hey Dele,
die erste Möglichkeit scheint echt zu passen.
Vielen Dank dir!!!
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
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.
Das immer nachzuprogrammieren ist sehr unelegant. Da hab ich lieber einmal ein "hässlichen" RegEx.

Vielen Dank an alle, ihr wart sehr hilfreich!

Seite 1 von 1

Vergleichbare Themen

12
Antw.
8850
Views
Regex für /xA0
von Thomas R. » 13.11.2013 12:13 • Verfasst in ABAP® für Anfänger
5
Antw.
2668
Views
Replace Regex
von Legxis » 24.05.2018 15:09 • Verfasst in ABAP® für Anfänger
17
Antw.
3766
Views
Regex in FIND
von hugo.data » 22.10.2018 15:33 • Verfasst in ABAP® für Anfänger
2
Antw.
2042
Views
Suchmuster mit Regex
von crishi_crd » 15.05.2014 08:19 • Verfasst in ABAP® für Anfänger
1
Antw.
2042
Views
XML Parser mit REGEX
von Adrian » 27.12.2013 09:23 • Verfasst in ABAP® für Anfänger

Über diesen Beitrag


Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

PDF-Anzeige unter EDGE
vor 4 Tagen von jocoder 2 / 66
Etikettendruck mit SmartForms
vor einer Woche von a-dead-trousers 2 / 67

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Aktuelle Forenbeiträge

PDF-Anzeige unter EDGE
vor 4 Tagen von jocoder 2 / 66
Etikettendruck mit SmartForms
vor einer Woche von a-dead-trousers 2 / 67

Unbeantwortete Forenbeiträge

Zwischensumme Adobe Forms
vor 3 Wochen von Lucyalison 1 / 129
Group Items auf einer Filterbar
vor 4 Wochen von Bright4.5 1 / 164