Reguläre Ausdrücke

Willemers Informatik-Ecke

In vielen Programmen werden zum Suchen ähnlicher Muster reguläre Ausdrücke verwendet. Beeindruckend ist, dass alle Programme die Ausdrücke gleich interpretieren. Das liegt allerdings nicht in erster Linie an der Harmoniesucht der UNIX-Programmierer, sondern einfach daran, dass UNIX die Funktion als Bibliothek zur Verfügung stellt.

Nach POSIX-Standard werden vier Funktionen zur Verfügung gestellt: regcomp(), regexec(), regerror() und regfree(). regcomp() übersetzt eine Zeichenkette mit einem regulären Ausdruck in eine Variable vom Typ regex_t. Diese wird dann mit der Funktion regexec() auf den zu durchsuchenden Text angewandt. Wird die Variable nicht mehr benötigt, wird sie mit regfree() freigegeben. regerror() liefert die Fehlermeldung, wenn regcomp() oder regexec() einen Fehler melden, indem sie einen Wert ungleich 0 zurückgeben. Programme, die diese Funktionen benutzen müssen die Datei regex.h einbinden.

Als Beispiel dient hier eine einfache Nachbildung des Programmes grep.

#include <stdlib.h>
#include <stdio.h>
#include <regex.h>

int main(int argc, char *argv[])
{
char puffer[512];
int i;
regex_t regexpr;
FILE *fp;

    if (argc<3) {
        printf("Usage: %s regexpression files\n", argv[0]);
        return -1;
    }
    if (regcomp(&regexpr, argv[1], REG_EXTENDED|REG_NEWLINE)) {
        printf("Problem beim Ausdruck %s\n", argv[1]);
        return -2;
    }
    for (i=2; i<argc; i++) {
        fp = fopen(argv[i], "r");
        if (fp!=NULL) {
            while (!feof(fp)) {
                fgets(puffer, sizeof(puffer)-1, fp);
                if (regexec(&regexpr, puffer, 0, NULL, 0)==0) {
                    puts(puffer);
                }
            }
            fclose(fp);
        }
    }
    regfree(&regexpr);
    return 0;
}

Diese Seite basiert auf Inhalten aus dem Buch Arnold Willemer: Wie werde ich UNIX-Guru
Verlagsrechte bei galileo computing


Homepage (C) Copyright 2002 Arnold Willemer