regex(3) Library Functions Manual regex(3) BEZEICHNUNG regcomp, regexec, regerror, regfree - Regularer-Ausdruck-Funktionen gemass POSIX BIBLIOTHEK Standard-C-Bibliothek (libc, -lc) UBERSICHT #include int regcomp(regex_t *restrict preg, const char *restrict regaus, int kschalter); int regexec(const regex_t *restrict preg, const char *restrict zeichenkette, size_t ntreffer, regmatch_t ptreffer[_Nullable restrict .ntreffer], int aschalter); size_t regerror(int fehlercode, const regex_t *_Nullable restrict preg, char fehlerpuf[_Nullable restrict .fehlerpufgrosse], size_t fehlerpufgrosse); void regfree(regex_t *preg); typedef struct { size_t re_nsub; } regex_t; typedef struct { regoff_t rm_so; regoff_t rm_eo; } regmatch_t; typedef /* */ regoff_t; BESCHREIBUNG Kompilierung regcomp() wird zur Kompilierung eines regularen Ausdrucks in eine Form verwandt, die fur nachfolgende regexec()-Suchen geeignet ist. Im Erfolgsfall wird der Musterpuffer bei *preg initialisert. regaus ist eine auf Nullbyte endende Zeichenkette. Die Locale muss die gleiche wie bei der Ausfuhrung von regexec() sein. Nachdem regcomp() erfolgreich war, halt preg->re_nsub die Anzahl der Unterausdrucke in regaus. Daher reicht es aus, ein Wert preg->re_nsub + 1 als ntreffer an regexec() zu ubergeben, um alle Treffer einzufangen. kschalter ist das bitweises ODER von null oder mehr der Folgenden: REG_EXTENDED Die Syntax der erweiterten regularen Ausdrucke gemass POSIX bei der Interpretation von regaus verwenden. Falls nicht gesetzt, werden die grundlegenden regularen Ausdrucke gemass POSIX verwandt. REG_ICASE Keine Unterscheidung der Gross-/Kleinschreibung durchfuhren. Nachfolgende regexec()-Suchen mit diesem Musterpuffer werden die Gross-/Kleinschreibung ignorieren. REG_NOSUB Nur den Gesamterfolg berichten. regexec() wird nur ptreffer fur REG_STARTEND verwenden und ntreffer ignorieren. REG_NEWLINE Passt-auf-jedes-Zeichen-Operator passt nicht auf einen Zeilenumbruch. Eine Liste nichtpassender Zeichen ([^]), die keinen Zeilenumbruch enthalt, passt nicht auf einen Zeilenumbruch. Passt-auf-Zeilenanfang-Operator (^) passt auf die leere Zeichenkette direkt nach einem Zeilenumbruch, unabhangig davon, ob die Ausfuhrungsschalter von regexec() (eflags) REG_NOTBOL enthalten. Passt-auf-Zeilenende-Operator ($) passt auf die leere Zeichenkette direkt vor einem Zeilenumbruch, unabhangig davon, ob eflags REG_NOTEOL enthalt. Vergleich regexec() wird zum Vergleich einer auf Nullbyte endenden Zeichenkette mit dem kompilierten Musterpuffer in *preg, der durch regexec() initialisiert sein muss. aschalter ist das bitweise ODER von null oder mehreren der folgenden Schalter: REG_NOTBOL Der Passt-auf-Zeilenanfang-Operator schlagt bei Vergleich immer fehl (siehe aber auch obigen Kompilierungsschalter REG_NEWLINE). Dieser Schalter kann verwandt werden, wenn verschiedene Anteile einer Zeichenkette an regexec() ubergeben werden und der Anfang einer Zeichenkette nicht als Anfang einer Zeile interpretiert werden soll. REG_NOTEOL Der Passt-auf-Zeilenende-Operator schlagt bei Vergleich immer fehl (siehe aber auch obigen Kompilierungsschalter REG_NEWLINE). REG_STARTEND Passt auf [Zeichenkette + ptreffer[0].rm_so, Zeichenkette + ptreffer[0].rm_eo) anstelle von [Zeichenkette, Zeichenkette + strlen(Zeichenkette)). Dies ermoglicht den Vergleich mit Nullbytes und vermeidet ein strlen(3) bei Zeichenketten mit bekannter Lange. Falls Treffer zuruckgeliefert wurden (REG_NOSUB wurde nicht an regcomp() ubergeben, der Vergleich war erfolgreich und ntreffer > 0) uberschreiben sie wie gewohnlich ptreffer und der Vergleichsversatz bleibt relativ zu zeichenkette (nicht zeichenkette + ptreffer[0].rm_so). Dieser Schalter ist eine BSD-Erweiterung und in POSIX nicht vorhanden. Vergleichs-Versatze Ausser REG_NOSUB wurde an regcomp() ubergeben, ist es moglich, den Ort des Treffers innerhalb von zeichenkette zu bestimmen: regexec() fullt ntreffer Elemente von ptreffer mit Ergebnissen: ptreffere[0] entspricht dem gesamten Treffer, ptreffer[1] dem ersten Unterausdruck usw. Falls es mehr Treffer als ntreffer gab, werden diese verworfen; falls weniger, werden unbenutzte Elemente von ptreffer mit -1en gefullt. Jeder zuruckgelieferte gultige (nicht -1) Treffer entspricht dem Bereich [zeichenkette + rm_so, zeichenkette + rm_eo). regoff_t ist ein vorzeichenbehafteter Ganzzahltyp, der den grossten Wert speichern kann, der in entweder dem Typ ptrdiff_t oder dem Typ ssize_t gespeichert werden kann. Fehlerberichterstattung Zur Umwandlung der von regcomp() und regexec() zuruckgelieferten Fehlercodes in Fehlermeldungszeichenketten wird regerror() verwandt. Falls preg kein NULL-Zeiger ist, muss fehlercode der neuste Fehlercode sein, der von einer Aktion auf preg zuruckgeliefert wurde. Falls fehlerpufgrosse nicht 0 ist, werden bis zu fehlerpufgrosse an Bytes in fehlerpuf kopiert; die Fehlerzeichenkette endet immer auf einem Nullbyte und wird abgeschnitten, damit sie passt. Freigabe regfree() deinitialisiert den Musterpuffer bei *preg und gibt samtlichen zugeordneten Speicher frei. *preg muss mittels regcomp() initialisiert worden sein. RUCKGABEWERT regcomp() liefert Null bei einer erfolgreichen Kompilierung oder einen Fehlercode bei einem Fehlschlag zuruck. regexec() liefert Null bei einem erfolgreichen Treffer oder REG_NOMATCH bei einem Fehlschlag zuruck. regerror() liefert die Grosse des Puffers zuruck, der zum Halten der Zeichenkette benotigt wird. FEHLER Von regcomp() konnen die folgenden Fehler zuruckgeliefert werden: REG_BADBR Ungultige Verwendung des Ruckwartsverweis-Operators. REG_BADPAT Ungultige Verwendung des Muster-Operators (wie Gruppierung oder Liste). REG_BADRPT Ungultige Verwendung des Wiederholungs-Operators wie die Verwendung von >>*<< als erstes Zeichen. REG_EBRACE Fehlender offenender oder schliessender Intervall-Operator (geschweifte Klammer). REG_EBRACK Fehlender offenender oder schliessender Listen-Operator (eckige Klammer). REG_ECOLLATE Ungultiges Sortierelement. REG_ECTYPE Unbekannter Zeichenklassenname. REG_EEND Nichtspezifizierter Fehler. Dies wird durch POSIX nicht definiert. REG_EESCAPE Abschliessender Ruckwartsschragstrich. REG_EPAREN Fehlender offenender oder schliessender Gruppen-Operator (runde Klammer). REG_ERANGE Ungultige Verwendung des Bereichs-Operators; beispielsweise tritt der Endpunkt des Bereichs vor dem Anfangspunkt auf. REG_ESIZE Kompilierte regulare Ausdrucke benotigen einen Musterpuffer, der grosser als 64 kB ist. Dies ist in POSIX nicht definiert. REG_ESPACE Die Routinen fur regulare Ausdrucke hatten nicht genug Speicher. REG_ESUBREG Ungultige Ruckwartsreferenz auf einen Unterausdruck. ATTRIBUTE Siehe attributes(7) fur eine Erlauterung der in diesem Abschnitt verwandten Ausdrucke. +-------------------------+-------------------------+------------------+ |Schnittstelle | Attribut | Wert | +-------------------------+-------------------------+------------------+ |regcomp(), regexec() | Multithread-Fahigkeit | MT-Sicher locale | +-------------------------+-------------------------+------------------+ |regerror() | Multithread-Fahigkeit | MT-Sicher env | +-------------------------+-------------------------+------------------+ |regfree() | Multithread-Fahigkeit | MT-Sicher | +-------------------------+-------------------------+------------------+ STANDARDS POSIX.1-2008. GESCHICHTE POSIX.1-2001. Vor POSIX.1-2008 musste regoff_t in der Lage sein, den grossten Wert abzuspeichern, der in entweder dem Typ off_t oder dem Typ ssize_t gespeichert werden kann. WARNUNGEN re_nsub muss nur initialisiert sein, falls REG_NOSUB nicht festgelegt wurde, aber alle bekannten Implementierungen initialisieren sie trotzdem. Sowohl regex_t als auch regmatch_t durfen (und haben) weitere Mitglieder, in beliebiger Reihenfolge. Referenzieren Sie sie immer uber den Namen. BEISPIELE #include #include #include #include #define ARRAY_SIZE(arr) (sizeof((arr)) / sizeof((arr)[0])) static const char *const str = "1) John Driverhacker;\n2) John Doe;\n3) John Foo;\n"; static const char *const re = "John.*o"; int main(void) { static const char *s = str; regex_t regex; regmatch_t pmatch[1]; regoff_t off, len; if (regcomp(®ex, re, REG_NEWLINE)) exit(EXIT_FAILURE); printf("Zeichenkette = \"%s\"\n", str); printf("Treffer:\n"); for (unsigned int i = 0; ; i++) { if (regexec(®ex, s, ARRAY_SIZE(pmatch), pmatch, 0)) break; off = pmatch[0].rm_so + (s - str); len = pmatch[0].rm_eo - pmatch[0].rm_so; printf("#%zu:\n", i); printf("Versatz = %jd; Lange = %jd\n", (intmax_t) off, (intmax_t) len); printf("Teilzeichenkette = \"%.*s\"\n", len, s + pmatch[0].rm_so); s += pmatch[0].rm_eo; } exit(EXIT_SUCCESS); } SIEHE AUCH grep(1), regex(7) Das Handbuch der Glibc, Abschnitt Regular Expressions UBERSETZUNG Die deutsche Ubersetzung dieser Handbuchseite wurde von Helge Kreutzmann erstellt. Diese Ubersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezuglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG ubernommen. Wenn Sie Fehler in der Ubersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Ubersetzer . Linux man-pages 6.06 31. Oktober 2023 regex(3)