regcmp(3G) regcmp(3G)
NAME
regcmp, regex - Regulären Ausdruck kompilieren und ausführen
SYNTAX
cc [option ...] datei ... -lgen [bibliothek ...]
#include <libgen.h>
char *regcmp(const char *string1 , ... /*, (char *)0 */);
char *regex(const char *re, const char *subject , ... );
extern char *loc1;
BESCHREIBUNG
regcmp() kompiliert einen regulären Ausdruck, der aus verketteten
Argumenten besteht, und gibt einen Zeiger auf die kompilierte Form
zurück. malloc(3C) wird zur Bereitstellung von Speicherplatz für die
kompilierte Form verwendet. Der Benutzer ist für die Freigabe von
unbenötigtem Platz verantwortlich. Eine Rückgabe NULL von regcmp()
zeigt an, daß ein ungültiges Argument vorliegt.
regex() sucht ein kompiliertes Muster in der Zeichenkette subject.
Zusätzliche Argumente werden übergeben, um Rückgabewerte zu erhalten.
Bei einem Fehler gibt regex() den Wert NULL zurück und bei Erfolg
einen Zeiger auf das nächste Zeichen, für das keine Übereinstimmung
gefunden wird. Ein globaler Zeichenzeiger loc1 weist auf die Stelle,
an der die Übereinstimmung beginnt. regcmp() und regex() wurden weit-
gehend vom Editor ed(1) übernommen, wobei Syntax und Semantik jedoch
leicht verändert wurden. Die gültigen Symbole und ihre jeweilige
Bedeutung sind wie folgt:
[]*.^ Diese Symbole haben dieselbe Bedeutung wie in ed(1).
$ Entspricht dem Ende der Zeichenkette; Die Zeichenfolge \n mit
einer Zeichenkette, entspricht einem Zeilenvorschub (NEWLINE).
- Das Minuszeichen in Klammern bedeutet bis einschließlich. So ist
beispielsweise [a-z] gleichbedeutend mit [abcd...xyz]. Das -
kann nur dann für sich selbst stehen, wenn es als das erste oder
letzte Zeichen verwendet wird. So entspricht beispielsweise der
Ausdruck []-] den Zeichen ] und -.
+ Ein regulärer Ausdruck mit nachfolgendem + bedeutet einmal oder
mehrere Male. So ist zum Beispiel [0-9]+ gleichbedeutend mit
[0-9][0-9]*.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
regcmp(3G) regcmp(3G)
{m} {m,} {m,u}
In {} eingeschlossene ganzzahlige Werte zeigen die Häufigkeit
an, mit der der vorangehende reguläre Ausdruck angewendet werden
soll. Der Wert m ist die Mindestanzahl und u das Maximum. u muß
kleiner als 256 sein. Wenn nur m vorhanden ist (z. B. {m}), wird
damit genau angegeben, wie oft der reguläre Ausdruck angewendet
werden soll. Der Wert {m,} ist analog zu {m,unendlich}. Die Ope-
rationen mit dem Pluszeichen + und dem Stern * sind gleichbedeu-
tend mit {1,} bzw. {0,}.
( ... )$n
Der Wert des geklammerten regulären Ausdrucks soll zurückgegeben
werden. Der Wert wird im (n+1)ten Argument nach dem Argument
subject gespeichert. Es sind höchstens zehn geklammerte reguläre
Ausdrücke zulässig. regex() führt die Zuweisungen auf jeden Fall
aus.
( ... )
Für Gruppierungen werden Klammern verwendet. Operatoren wie bei-
spielsweise *, +, {}, können auf Einzelzeichen oder auf einen
von Klammern umschlossenen regulären Ausdruck angewendet werden.
Beispiel: (a*(cb+)*)$0.
Notwendigerweise sind alle oben definierten Symbole Sonderzeichen.
Daher müssen sie mit einem Backslash \ gekennzeichnet werden, wenn sie
für sich stehen sollen.
BEISPIELE
Das folgende Beispiel sucht ein führendes Zeilenvorschubzeichen in der
Zeichenkette subject, auf die cursor zeigt.
char *cursor, *newcursor, *ptr;
...
newcursor = regex((ptr = regcmp("^\n", (char *)0)), cursor);
free(ptr);
Das folgende Beispiel durchsucht die Zeichenkette Testing3 nach Übe-
reinstimmungen und gibt die Adresse des Zeichens hinter dem letzten
übereinstimmenden Zeichen (dem Zeichen 4) zurück. Die Zeichenkette
Testing3 wird in das Zeichen-Array ret0 kopiert.
char ret0[9];
char *newcursor, *name;
...
name = regcmp("([A-Za-z][A-za-z0-9]{0,7})$0", (char *)0);
newcursor = regex(name, "012Testing345", ret0);
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
regcmp(3G) regcmp(3G)
Bei folgendem Beispiel wird ein vorkompilierter regulärer Ausdruck in
file.i [siehe regcmp(1)] auf string geprüft.
#include "file.i"
char *string, *newcursor;
...
newcursor = regex(name, string);
FEHLER
Die Funktion regcmp() kann bei folgender Bedingung fehlschlagen:
ENOMEM Nicht genügend Speicher verfügbar.
HINWEISE
Das Benutzerprogramm kann möglicherweise keinen Speicherplatz mehr zur
Verfügung stellen, wenn regcmp() iterativ ohne Freigabe der nicht mehr
benötigten Vektoren aufgerufen wird.
Wenn Sie eine dieser Funktionen verwenden, müssen Sie bei der Kompi-
lierung die Bibliothek libgen anbinden (cc -lgen).
SIEHE AUCH
ed(1), regcmp(1), regex(3), malloc(3C), regcomp(3C), regexpr(3G),
expressions(5), libgen(5), recomp(5), regex(5), regexp(5).
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98