11.37 regex()

Mit dieser Funktion kann ein Regulärer Ausdruck auf einen String oder eine Liste von Strings angewendet werden.

Um einen möglichst hohen Funktionsumfang zu ermöglichen, bindet der IDM hierzu die freie PCRE-Bibliothek dynamisch ein. Damit sind Musterausdrücke analog zu PERL möglich. Falls Sie diese Funktion also in ihrem Produkt einsetzen, sollten Sie Lizenzbedingungen und Dokumentation von PCRE (www.pcre.org) beachten. Bezüglich der Anbindung ist Kapitel „PCRE-Bibliothek zur Unterstützung Regulärer Ausdrücke“ zu berücksichtigen. Die ISA empfiehlt eine PCRE-Bibliothek in der Version 8.* für ein ordnungsgemäßes Funktionieren. Die PCRE-Funktionen werden dabei für Pattern-Matching und Capturing von String-Teilen benutzt. Der IDM übernimmt dann Auswertung und Ersetzung.

Syntaktisch werden folgende Reguläre Ausdrücke vom IDM akzeptiert um so die Operationen Matching und Substitution zu ermöglichen:

  • Matching

    m/<pattern>/<modifiers>
  • Substitution

    s/<pattern>/<replacement>/<modifiers>

Für die Konfiguration der Operation sind folgende Modifikatoren (<modifiers>) erlaubt:

s

single-line string  (PCRE_DOTALL)

m

multi-line (PCRE_MULTILINE)

i

ignore case (PCRE_CASELESS)

g

global  search – Mustererkennung wird wiederholt

x

extended (PCRE_EXTENDED)

f

first line (PCRE_FIRSTLINE)

W

unicode (wide) character classes (PCRE_UCP)

X

extra (PCRE_EXTRA)

U

ungreedy (PCRE_UNGREEDY)

In Klammern steht dabei, wie die Modifikatoren an PCRE weitergereicht werden. Deren Anwendung erfolgt also nicht durch den IDM sondern durch die PCRE-Bibliothek.

Ohne Fehlermeldung überlesen werden die Modifikatoren o und e.

Die eigentliche Anwendung von <pattern> und <replacement> erfolgt dann mit der PCRE-Bibliothek. Weitere Details und Informationen zu den Regulären Ausdrücken sind deshalb der Dokumentation der verwendeten PCRE-Bibliothek zu entnehmen.

Der IDM erlaubt auch die Aufteilung der Bestandteile <pattern> und <replacement> des Regulären Ausdrucks in zwei getrennte Parameter, wobei dann allerdings keine Modifikatoren <modifiers> möglich sind. Normalerweise bestimmt die Operation die Art der zurückgegebenen Ergebnisse. Durch einen Action-Parameter kann dies aber gesteuert werden um so z.B. nur die Anzahl der gefundenen Matches zu liefern, eine Filterung zu erreichen oder um die Werte der <pattern>-Variablen zu erhalten.

Folgende Aktionen mit entsprechenden Auswertungen sind möglich:

Tabelle 20-2: Aktionen, Rückgabetypen und Auswertungen der regex-Funktion

Aktion

Rückgabetyp

Auswertung

regex_eval

boolean
string
list[string]

Je nach Operation wird entweder zurückgeliefert, ob wenigsten einer der Strings dem Regulären Ausdruck entspricht (Matching-Operation true oder false).

Oder im Substitution-Fall werden die ersetzten String(s) zurückgeliefert, falls das Muster übereinstimmt oder eben der Orginal-String.

regex_match

boolean
list[string]

Führt nur eine Prüfung des Musters durch und liefert true wenn das Muster übereinstimmt, ansonsten false. Bei einer String-Liste werden in die Resultatsliste nur Strings aufgenommen, welche das Muster erfüllen.

regex_unmatch

boolean
list[string]

Führt nur eine Prüfung des Musters durch und liefert false wenn das Muster übereinstimmt, ansonsten true. Bei einer String-Liste werden in die Resultatsliste nur Strings aufgenommen, welche das Muster nicht erfüllen

regex_count

integer

Zählt die Anzahl gefundener Muster im String bzw. der String-Liste. Pro String wird maximal +1 gezählt, sodass bei der Anwendung auf einen Einzel-String als Wert 0 oder 1 herauskommt und bei einer String-Liste ein Wert im Bereich 0 … itemcount().

regex_locate

integer
list[integer]

Liefert die Zeichenposition der ersten Übereinstimmung bei der Anwendung auf einen Einzel-String. Für eine String-Liste werden die Indexpositionen in der Liste geliefert, bei denen das Mustern erfüllt ist.

Der IDM erlaubt die Anwendung der regex-Funktion auf jeden beliebigen Sammlungsdatentyp (list, hash, matrix, vector). Eine generierte Rückgabeliste ist aber immer vom Typ list ohne Übernahme einer besonderen Indizierung der Ausgangsliste. Vor der Anwendung des Regulären Ausdrucks werden Werte, die nicht vom Datentyp string sind, in einen String umgewandelt, wie es auch z.B. bei print <Value>; geschieht.

Definition

anyvalue regex
(
      anyvalue StringOrList input,
      string   Pattern input
  { , string   Replace input }
  { , enum     Action  := regex_eval input }
)

Parameter

anyvalue StringOrList input
Dieser Parameter beinhaltet den String bzw. die Liste von Strings auf die der Reguläre Ausdruck angewendet wird.
string Pattern input
Dieser Parameter beinhaltet entweder den Regulären Ausdruck oder den Muster-String (<pattern>), falls der Reguläre Ausdruck in <pattern> und <replacement> aufgeteilt wird.
string Replace input
Dieser optionale Parameter sollte den Ersetzungs-String (<replacement>) beinhalten. wenn für den Funktionsaufruf der Reguläre Ausdruck in <pattern> und <replacement> aufgetrennt wird.
enum Action := regex_eval input

Dieser optionale Parameter steuert die Ergebnisauswertung. Folgende Aktionen sind dabei möglich:

regex_eval (Standard)

Evaluation des Regulären Ausdrucks (Matching oder Substituition).

regex_match

Filterung auf Strings, die dem Muster entsprechen.

regex_unmatch

Filterung auf Strings, die dem Muster nicht entsprechen.

regex_count

Anzahl der gefundenen Muster (+1 pro Suchstring).

regex_vars

Liefert den Inhalt aller vom Suchmuster definierten Variablen.

regex_locate

Liefert die String-Position bzw. Indexposition des gefundenen Musters.

Rückgabewert

Rückgabewert und -typ sind abhängig von der Auswertungsaktion und in „Tabelle 20-2“ (oben) beschrieben.

Beispiele

  1. Auf Ziffern in einem String prüfen

    print regex("Ist 127 eine Zahl?", "\\d+");

    Ausgabe

    true
  2. Alle Dezimalzahlen durch ein N ersetzen

    print regex("42 ist größer als 10", "s/(\d+)/N/g");

    Ausgabe

    "N ist größer als N"
  3. Nur Strings ausgeben auf die das Muster passt

    print regex("127,5", "^\\d+,\\d+$", regex_match);
    print regex("1275", "^\\d+,\\d+$", regex_match);
    print regex(["3,7", "17,5", "0", "21,03"], "^\\d+,\\d+$", regex_match);

    Ausgabe

    "127,5"
    ""
    ["3,7","17,5","21,03"]
  4. Mehrere reguläre Ausdrücke auf eine Liste anwenden

    • nur Werte auflisten die ein Wort beinhalten
    • die Anzahl der Wörter zählen
    • jeden Eintrag in >> << einrahmen
    • alle Geburtsjahre auflisten
    variable list BirthDays := ["12-13-1973", "Ina", "1-7-1965", "Udo"];
    print regex(BirthDays, "^\\w+$", regex_match);
    print regex(BirthDays, "^\\w+$", regex_count);
    print regex(BirthDays, "s/(.*)/>> $1 <</", regex_match);
    print regex(BirthDays, "s/\\d+-\\d+-(\\d+)/$1/", regex_match);

    Ausgabe

    ["Ina","Udo"]
    2
    [">> 12-13-1973 <<",">> Ina <<",">> 1-7-1965 <<",">> Udo <<"]
    ["1973","1965"]
  5. Auflistung der Variablenwerte die in einem Regulären Ausdruck enthalten sind

    print regex("+2500 Euro oder mehr", "(\\d+)\\s+(\\w+)", regex_vars);

    Ausgabe

    ["2500 Euro","2500","Euro"]
  6. Auflistung der Zugriffsindizes für die gefundenen Muster in einer Liste oder einem String

    variable list Locales := [ "de_DE.UTF8", "C.UTF-8", "de_AT.utf8",
                               "en_AU.utf8", "en_ZM", "POSIX", "de_CH.uf8" ];
    print regex(Locales, "/^de_/", regex_locate);
    print regex("Hallo Welt", "/W/", regex_locate);

    Ausgabe

    [1,3,7]
    7
  7. Ausnutzung der automatischen Konvertierung von Werten in einer Liste zu string-Werten

    record Rec4711 {} 
    print regex([123, winsys_x11, "Bond 007", opt_w2kprefsize_compat, Rec4711],
                "s/\\d+/N/g");

    Ausgabe

    ["N","winsys_xN","Bond N","opt_wNkprefsize_compat","RecN"]

Verfügbarkeit

Ab IDM-Version A.06.02.g

PCRE-Bibliothek zur Unterstützung Regulärer Ausdrücke

Um Reguläre Ausdrücke über die eingebaute-Funktion regex() oder als Format im IDM zu verwenden, ist die freie Bibliothek PCRE (Perl Compatible Regular Expression, siehe hierzu auch www.pcre.org) notwendig. Falls Sie diese Funktion also in ihrem Produkt einsetzen, sollten Sie die Lizenzbedingungen von PCRE beachten.

Der IDM setzt eine PCRE-Bibliothek ab der Version 3 mit aktivierter Unicode-Unterstützung und mit der normalen PCRE-Schnittstelle voraus. Die mit PCRE-Version 10 eingeführte PCRE2-Schnittstelle wird noch nicht unterstützt. Empfohlen wird die aktuell stabile Version 8.* der PCRE-Bibliothek. Typischerweise sind die meisten aktuellen Linux-Distributionen schon von Haus aus mit der PCRE-Bibliothek ausgestattet oder erlauben eine problemlose Nachinstallation. Für die Nutzung unter Windows bietet sich neben der eigenen Kompilierung auch der Download einer vorkompilierten Bibliothek, z.B. von www.pcre.org oder www.airesoft.co.uk an.

Wichtig

Je nach Version ist immer mit einem unterschiedlichem Funktionsumfang und Fehlerstand der PCRE-Bibliothek zu rechnen. Es ist zu beachten, dass die ISA keine Gewährleistung auf die PCRE-Bibliothek und ihre Funktionen geben kann.

Die PCRE-Bibliothek wird normalerweise dynamisch angebunden indem die Funktionen pcre_compile, pcre_study, pcre_exec, pcre_version und pcre_free gesucht werden. Der IDM übergibt die Strings in einer UTF8-Kodierung weshalb die angebundene PCRE-Bibliothek auch mit UTF8-Support ausgestattet sein sollte.

Folgende Anbindungsarten und damit verbundenen Suchreihenfolgen lässt der IDM zu:

Tabelle 20-3: Anbindungsarten und Suchreihenfolgen der PCRE-Bibliothek

Anbindungsart

Windows

Unix/Linux1

E

Funktionssuche direkt im Executable

 

 

A

Applikationsbezogen

(relativ zum Pfad der Anwendung)

pcre3.dll

dll\pcre3.dll

pcre.dll

dll\pcre.dll

pcre.(so|sl)

lib/pcre.(so|sl)

../lib/pcre.(so|sl)2

S

Systemspezifische Library-Suche

(z.B. über die Pfadvariablen PATH oder LD_LIBRARY_PATH)

pcre3.dll

pcre.dll

pcre.(so|sl)

Bei Erstellung einer Anwendung mit den IDM-Bibliotheken erfolgt der Versuch einer Anbindung in der Reihenfolge E – A – S. Damit ist die einfachste Art, die eigene IDM-Anwendung mit der Unterstützung für Reguläre Ausdrücke auszustatten, das Hinzulegen der dynamischen PCRE-Bibliothek neben dem Executable. Andernfalls wird die im System befindliche Bibliothek angezogen.

Die von der ISA ausgelieferten IDM-Anwendungen zum Entwickeln und Simulieren (IDM, RIDM*, IDMED und Debugger) haben die PCRE-Bibliothek schon statisch eingebaut und benutzen die Anbindungssuche A – E – S, sodass die Nutzung einer externen PCRE-Bibliothek damit ebenso möglich ist.

Falls in der eigenen IDM-Anwendung ebenso eine statische Anbindung erwünscht ist, sollte folgendes beachtet werden: Falls ein Linken der Anwendung ohne Referenzierung der PCRE-Funktionen erfolgt, muss diese zwangsweise komplett angezogen werden (typische Linkoptionen sind z.B. --whole-archive, +forceload oder /opt:notref) und dafür gesorgt werden, dass die PCRE-Funktionen über die systemspezifische Funktionspointersuche gefunden wird (dies macht unter Umständen ein Exportieren der Funktionen von der Anwendung notwendig). Die ISA empfiehlt aber die Anbindung über eine externe Bibliothek (DLL, Shared Library), sodass für die eigene Produktauslieferung ein Austausch der PCRE-Fassung erleichtert wird.

Die Anbindungsreihenfolge der PCRE-Bibliothek kann vom Anwendungsprogrammierer mit der Schnittstellenfunktion DM_Control bzw. DM_ControlEx über die Aktion DMF_PCREBinding gesteuert werden.