| 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[_Nullable restrict .ntreffer],
int aschalter);
size_t regerror(int fehlercode, const regex_t *_Nullable restrict preg,
char fehlerpuf[_Nullable restrict .fehlerpufgröße],
size_t fehlerpufgröße);
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;
regcomp() wird zur Kompilierung eines regulären Ausdrucks in eine Form verwandt, die für 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 Ausführung von regexec() sein.
Nachdem regcomp() erfolgreich war, hält preg->re_nsub die Anzahl der Unterausdrücke in regaus. Daher reicht es aus, ein Wert preg->re_nsub + 1 als ntreffer an regexec() zu übergeben, um alle Treffer einzufangen.
kschalter ist das bitweises ODER von null oder mehr der Folgenden:
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:
Außer REG_NOSUB wurde an regcomp() übergeben, ist es möglich, den Ort des Treffers innerhalb von zeichenkette zu bestimmen: regexec() füllt 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 gefüllt.
Jeder zurückgelieferte gültige (nicht -1) Treffer entspricht dem Bereich [zeichenkette + rm_so, zeichenkette + rm_eo).
regoff_t ist ein vorzeichenbehafteter Ganzzahltyp, der den größten Wert speichern kann, der in entweder dem Typ ptrdiff_t oder dem Typ ssize_t gespeichert werden kann.
Zur Umwandlung der von regcomp() und regexec() zurückgelieferten Fehlercodes in Fehlermeldungszeichenketten wird regerror() verwandt.
Falls preg kein NULL-Zeiger ist, muss fehlercode der neuste Fehlercode sein, der von einer Aktion auf preg zurückgeliefert wurde.
Falls fehlerpufgröße nicht 0 ist, werden bis zu fehlerpufgröße an Bytes in fehlerpuf kopiert; die Fehlerzeichenkette endet immer auf einem Nullbyte und wird abgeschnitten, damit sie passt.
regfree() deinitialisiert den Musterpuffer bei *preg und gibt sämtlichen zugeordneten Speicher frei. *preg muss mittels regcomp() initialisiert worden sein.
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.
regerror() liefert die Größe des Puffers zurück, der zum Halten der Zeichenkette benötigt wird.
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-Sicher locale |
| regerror() | Multithread-Fähigkeit | MT-Sicher env |
| regfree() | Multithread-Fähigkeit | MT-Sicher |
POSIX.1-2008.
POSIX.1-2001.
Vor POSIX.1-2008 musste regoff_t in der Lage sein, den größten Wert abzuspeichern, der in entweder dem Typ off_t oder dem Typ ssize_t gespeichert werden kann.
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 dürfen (und haben) weitere Mitglieder, in beliebiger Reihenfolge. Referenzieren Sie sie immer über den Namen.
#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); }
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: debian-l10n-german@lists.debian.org.
| 15. Juni 2024 | Linux man-pages 6.9.1 |