Ansicht
Dokumentation

ABENREGEX_SEARCH - REGEX SEARCH

ABENREGEX_SEARCH - REGEX SEARCH

TXBHW - Original Tax Base Amount in Local Currency   Addresses (Business Address Services)  
Diese Dokumentation steht unter dem Copyright der SAP AG.
SAP E-Book

Suchmuster

Eine Hauptanwendung von regulären Ausdrücken ist das Suchen (und nachfolgende Ersetzen) von Teilfolgen in Zeichenfolgen. In der Regel ist man an einer bestimmten Auswahl aller Teilfolgen interessiert, auf die ein regulärer Ausdruck passt. In ABAP wird das Suchen über reguläre Ausdrücke mit dem Zusatz REGEX der Anweisung FIND oder einer der Suchfunktionen realisiert, wobei die gefundenen Teilfolgen überschneidungsfrei nach der leftmost-longest-Regel ermittelt werden.

Leftmost-longest-Regel

Zuerst wird die am weitesten links stehende Teilfolge der Zeichenfolge ermittelt, auf die der reguläre Ausdruck passt (leftmost). Gibt es mehrere Teilfolgen, so wird die längste Folge gewählt (longest). Anschließend wird dieser Vorgang für die hinter der Fundstelle beginnende Restfolge wiederholt.

Beispiel

Für den regulären Ausdruck d*od* werden fünf Teilfolgen in "doobedoddoo" gefunden: "do" an Offset 0, "o" an Offset 2, "dodd" an Offset 5, "o" an Offset 9 und "o" an Offset 10.

DATA result_tab TYPE match_result_tab.
FIND ALL OCCURRENCES OF regex 'd*od*' IN 'doobedoddoo'
                     RESULTS result_tab.

Operatoren für Suchmuster

Die folgenden Operatoren unterstützen das Suchen in Zeichenfolgen. Diese Operatoren werden aus den Sonderzeichen ^, $, \, <, >, (, ), = und ! aufgebaut. Die Sonderzeichen können durch das Voranstellen von \ zu Literalzeichen gemacht werden.

Anfang und Ende einer Zeile

Der Operator ^ wirkt als Ankerzeichen für den Offset vor dem ersten Zeichen einer Zeile. Der Operator $ wirkt als Ankerzeichen für den Offset hinter dem letzten Zeichen einer Zeile.

Zeichenartige Datenobjekte enthalten mindestens einen Zeilenanfang und ein Zeilenende, die wie folgt definiert sind:

  • Bei einem Textfeld vom Typ c und den anderen zeichenartigen Datenobjekten fester Länge liegt ein Zeilenanfang vor dem ersten Zeichen und ein Zeilenende hinter der definierten Länge.
  • Bei einem String vom Typ string liegt ein Zeilenanfang vor dem ersten Zeichen und ein Zeilenende hinter seiner aktuellen Länge.

Wenn ein zeichenartiges Datenobjekt Steuerzeichen für Zeilenumbruch oder Return enthält, kommen weitere Zeilenanfänge und Zeilenenden hinzu:

  • Vor jedem Steuerzeichen für Zeilenumbruch oder Return liegt ein Zeilende.
  • Hinter jedem Steuerzeichen für Zeilenumbruch oder Return liegt ein Zeilenanfang.

Hinweis

Innerhalb von ABAP-Programmen treten Steuerzeichen in der Regel nur beim Import von extern generierten Datensätzen oder bei der expliziten Angabe von Steuerzeichen in Zeichenketten-Templates auf.

Beispiel

Die Zeichenfolge in text enthält zwei über ein Zeichenketten-Template eingefügte Steuerzeichen für Zeilenumbrüche. Die erste Suche findet drei Zeilanfänge mit den Offsets 0, 6 und 12. Die zweite Suche findet drei Zeilenenden mit den Offsets 5, 11 und 17.

DATA TEXT type STRING.
DATA result_tab TYPE match_result_tab.

text = |Line1\nLine2\nLine3|.

FIND ALL OCCURRENCES OF REGEX '^'
     IN text RESULTS result_tab.

FIND ALL OCCURRENCES OF REGEX '$'
     IN text RESULTS result_tab.

Anfang und Ende einer Zeichenfolge

Die Operatoren \A und \z wirken als Ankerzeichen für den Offset vor dem ersten Zeichen einer Zeichenfolge und dem Offset hinter dem letzten Zeichen einer Zeichenfolge. Mit dem Operator \A wird also immer der Offset 0 gefunden. Bei einem String vom Typ string wird mit \z der Offset hinter dem letzten Zeichen gefunden. Bei Textfeldern vom Typ c werden die schließenden Leerzeichen berücksichtigt, so dass mit \z immer der Offset hinter der definierten Länge gefunden wird.

Neben \z gibt es einen weiteren Operator \Z für das Ende einer Zeichenfolge. Der Operator \Z wirkt wie \z wobei aber alle Zeilenumbrüche am Ende der Zeichenfolge ignoriert werden.

Hinweis

Solange eine Zeichenfolge keine Steuerzeichen enthält, verhalten sich die Operatoren ^, $ und \A, \z, \Z gleich.

Beispiel

Die folgende Suche findet "Smile" am Zeilenbeginn der ersten Zeile und am Zeilenende der letzten Zeile der internen Tabelle text_tab. Wäre der Zeilentyp string statt c, würde "Smile" am Zeilenende jeder Zeile gefunden.

DATA text(10) TYPE c.
DATA text_tab LIKE TABLE OF text.

DATA result_tab TYPE match_result_tab.

APPEND 'Smile' TO text_tab.
APPEND ' Smile' TO text_tab.
APPEND '  Smile' TO text_tab.
APPEND '   Smile' TO text_tab.
APPEND '    Smile' TO text_tab.
APPEND '     Smile' TO text_tab.

FIND ALL OCCURRENCES OF regex '\A(?:Smile)|(?:Smile)\z'
     IN TABLE text_tab RESULTS result_tab.

Beispiel

Die folgenden Suchen zeigen den Unterschied zwischen \z und \Z. Die erste Suche ist nicht erfolgreich, da Zeilenumbrüche zwischen dem gesuchten Text und dem Ende der Zeichenfolge stehen. Diese werden bei der zweiten Suche ignoriert.

DATA text TYPE string.

text = |... this is the end\n\n\n|.

FIND  REGEX 'end\z' IN text.
IF sy-subrc <> 0.
  cl_demo_output=>write_text( `There's no end.` ).
ENDIF.
FIND  REGEX 'end\Z' IN text.
IF sy-subrc = 0.
  cl_demo_output=>write_text( `The end is near the end.` ).
ENDIF.
cl_demo_output=>display( ).

Anfang und Ende eines Worts

Der Operator \< passt auf den Anfang, der Operator \> passt auf das Ende eines Worts. Der Operator \b passt sowohl auf den Anfang als auch auf das Ende eines Worts. Als Wörter gelten ununterbrochene Folgen von alphanumerischen Zeichen.

Beispiel

Die erste Suche findet die fünf Stellen, an denen "s" oder "S" am Wortanfang vorkommt. Die zweite Suche findet die beiden "s" an einem Wortende.

DATA text TYPE string.
DATA result_tab TYPE match_result_tab.

text = `Sometimes snow seems so soft.`.

FIND ALL OCCURRENCES OF regex '\<s'
     IN text IGNORING CASE
     RESULTS result_tab.
FIND ALL OCCURRENCES OF regex 's\b'
     IN text IGNORING CASE
     RESULTS result_tab.

Vorausschau-Bedingungen

Der Operator (?=... ) definiert einen regulären Ausdruck s als Folgebedingung für einen vorhergehenden regulären Ausdruck r. Der reguläre Ausdruck r(?=s) wirkt bei einer Suche wie der reguläre Ausdruck r, sofern der reguläre Ausdruck s auf die Teilfolge passt, die direkt auf die durch r gefundene Teilfolge folgt.

Der Operator (?!... ) wirkt wie (?=... ), mit dem Unterschied, dass r(?!s) auf die Teilfolge für r passt, wenn s nicht auf die folgende Teilfolge passt.

Hinweis

Die von der Vorausschau s gefundene Teilfolge ist nicht Teil der Übereinstimmung, die von r(?=s) gefunden wird.

Beispiel

Die folgende Suche findet die Teilfolge "la" an Offset 7.

DATA text TYPE string.
DATA result_tab TYPE match_result_tab.

text = `Shalalala!`.

FIND ALL OCCURRENCES OF REGEX '(?:la)(?=!)'
     IN text RESULTS result_tab.

Schnittoperator

Der Operator (?>... ) greift in die Prozessierung der Suche nach Zeichenfolgenmuster ein. Die Suche erfolgt normalerweise nach der Leftmost-longest-Regel des POSIX-Standards. Erst werden alle möglichen ersten Übereinstimmungen festgestellt und daraus wird dann die längste Übereinstimmung ausgewählt. Hierfür wird beim Abgleich von Verkettungen und Alternativen ein so genanntes Backtracking durchgeführt. Dabei kehrt die Suche zu Verzweigungspunkten zurück um festzustellen, ob eine andere Alternative oder eine weitere Iteration einer Verkettung zu einer längeren Übereinstimmung führt.

Der Schnittoperator schaltet dieses Backtracking für den enthaltenen Unterausdruck aus. Die gesamte Suche wird nach dem ersten erfolgreichen Abgleich des Unterausdrucks abgebrochen und das Ergebnis zurückgeliefert, wodurch die Leftmost-longest-Regel und auch die Regel, dass möglichst der gesamte Ausdruck passen muss, außer Kraft gesetzt werden.

Hinweise

  • Bei Verwendung des Schnittoperators wird im Prinzip das Suchverhalten von regulären Ausdrücken in Perl simuliert, die nicht dem POSIX-Standard folgen.
  • Der Schnittoperator sollte nur von sehr erfahrenen Entwicklern für Aufgaben verwendet werden, die anders absolut nicht lösbar sind.

Beispiel

Die erste Suche ohne Schnittoperator findet "aabbaaaa" an Offset 2. Die zweite Suche mit Schnittoperator findet davon nur "aabb". Dies entspricht der ersten Alternative. Die Suche nach der zweiten Alternative, die in diesem Fall länger wäre, wird nicht ausgeführt. Die dritte Suche ist nicht erfolgreich. Der Teilausdruck a+ erfasst alle auf Offset 2 folgenden Zeichen des Textes (gieriges Verhalten), sodass für das einzelne Muster a außerhalb des Schnittoperators kein Zeichen mehr übrig bleibt. Letzteres verletzt die sonst gültige allgemeine Regel, dass primär der gesamte reguläre Ausdruck passen muss.

DATA text TYPE string.
DATA moff TYPE i.
DATA mlen TYPE i.

text = `xxaabbaaaaxx`.

FIND REGEX 'a+b+|[ab]+' IN text MATCH OFFSET moff
                                MATCH LENGTH mlen.
IF sy-subrc = 0.
  cl_demo_output=>write_text( |{ text+moff(mlen) }| ).
ENDIF.

FIND REGEX '(?>a+b+|[ab]+)' IN text MATCH OFFSET moff
                                    MATCH LENGTH mlen.
IF sy-subrc = 0.
  cl_demo_output=>write_text( |{ text+moff(mlen) }| ).
ENDIF.

FIND REGEX '(?>a+|a)a' IN text MATCH OFFSET moff
                               MATCH LENGTH mlen.
IF sy-subrc <> 0.
  cl_demo_output=>write_text( 'Nothing found' ).
ENDIF.
cl_demo_output=>display( ).






BAL Application Log Documentation   BAL_S_LOG - Application Log: Log header data  
Diese Dokumentation steht unter dem Copyright der SAP AG.

Length: 16838 Date: 20240523 Time: 100342     sap01-206 ( 216 ms )