regex(3) | Library Functions Manual | regex(3) |
regcomp, regexec, regerror, regfree - Regulärer-Ausdruck-Funktionen gemäß POSIX
Standard-C-Bibliothek (libc, -lc)
#include <regex.h>
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[restrict .ntreffer], int aschalter);
size_t regerror(int fehlercode, const regex_t *restrict preg, char fehlerpuf[restrict .fehlerpufgröße], size_t fehlerpufgröße); void regfree(regex_t *preg);
regcomp() wird zur Kompilierung eines regulären Ausdrucks in eine Form verwandt, die für nachfolgende regexec()-Suchen geeignet ist.
regcomp() wird preg, ein Zeiger auf einen Musterpuffer-Speicherbereich, regaus, ein Zeiger auf eine Zeichenkette mit Nullbyte am Ende und kschalter, Schalter zur Bestimmung des Typs der Kompilierung, übergeben.
Eine Suche mit regulären Ausdrücken muss mittels kompilierter Musterpuffer erfolgen, daher muss regexec() immer die Adresse eines regcomp()-initialisierten Musterpuffers bereitgestellt werden.
kschalter ist das bitweises ODER von null oder mehr der Folgenden:
regexec() wird zum Vergleich einer auf Nullbyte endenden Zeichenkette mit dem vorkompilierten Musterpuffer preg verwandt. ntreffer und ptreffer werden zur Bereitstellung von Informationen bezüglich der Position von Treffern verwandt. aschalter ist das bitweise ODER von null oder mehreren der folgenden Schalter:
Es ist möglich, die Übereinstimmungs-Adressierungsinformationen zu erhalten, falls nicht REG_NOSUB für die Kompilierung des Musterpuffers verwandt wurde. ptreffer muss so dimensoniert sein, dass es mindestens ntreffer Elemente enthält. Diese werden durch regexec() durch Teilzeichenketten-Übereinstimmungsadressen gefüllt. Die Versätze des bei der iten offenen Klammer beginnenden Unterausdrucks werden in ptreffer[i] gespeichert. Die Übereinstimmungsadresse des gesamten regulären Ausdrucks wird in ptreffer[0] gespeichert. (Beachten Sie, dass ptreffer mindestens N+1 sein muss, um den Versatz des Nten Unterausdruckstreffers zurückzuliefern.) Alle nicht verwandten Strukturelemente werden den Wert -1 enthalten.
Die Struktur regmatch_t, die der Typ von ptreffer ist, wird in <regex.h> definiert.
typedef struct { regoff_t rm_so; regoff_t rm_eo; } regmatch_t;
Jedes Element rm_so, das nicht -1 ist, zeigt den Startversatz des nächsten größten Teilzeichenkettentreffers innerhalb der Zeichenkette an. Das relative Element rm_eo zeigt den Endversatz des Treffers an; dies ist das erste Zeichen nach dem übereinstimmenden Text.
Zur Umwandlung der von regcomp() und regexec() zurückgelieferten Fehlercodes in Fehlermeldungszeichenketten wird regerror() verwandt.
regerror() wird der Fehlercode fehlercode, der Musterzeichenkettenpuffer preg, ein Zeiger auf einen Zeichenkettenpuffer fehlerpuf und die Größe des Zeichenkettenpuffers fehlerpufgröße übergeben. Sie liefert die Größe des fehlerpuf zurück, die benötigt wird, um die mit Nullbyte abgeschlossene Fehlermeldungszeichenkette zu enthalten. Falls sowohl fehlerpuf als auch fehlerpufgröße von null verschieden sind, wird fehlerpuf mit den ersten fehlerpufgröße - 1 Zeichen der Fehlermeldung und einem abschließenden Nullbyte (»\0«) aufgefüllt.
Wird regfree() ein vorkompilierter Puffer, preg, bereitgestellt, dann wird es den vom Musterpuffer durch den Kompilierprozess regcomp() belegten Speicher freigeben.
regcomp() liefert Null bei einer erfolgreichen Kompilierung oder einen Fehlercode bei einem Fehlschlag zurück.
regexec() liefert Null bei einem erfolgreichen Treffer oder REG_NOMATCH bei einem Fehlschlag zurück.
Von regcomp() können die folgenden Fehler zurückgeliefert werden:
Siehe attributes(7) für eine Erläuterung der in diesem Abschnitt verwandten Ausdrücke.
Schnittstelle | Attribut | Wert |
regcomp(), regexec() | Multithread-Fähigkeit | MT-Safe locale |
regerror() | Multithread-Fähigkeit | MT-Safe env |
regfree() | Multithread-Fähigkeit | MT-Safe |
POSIX.1-2001, POSIX.1-2008.
#include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <regex.h> #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; Länge = %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); }
grep(1), regex(7)
Das Handbuch der Glibc, Abschnitt Regular Expressions
Die deutsche Übersetzung dieser Handbuchseite wurde von Helge Kreutzmann <debian@helgefjell.de> erstellt.
Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.
Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Übersetzer.
5. Februar 2023 | Linux man-pages 6.03 |