Definition | #include <libgen.h> char *regcmp (const char *string1 [, char *string2, ...] /* , (char *) 0) */; char *regex (const char *re, const char *subject [ , char *ret0, ... ] ); extern char *__loc1; |
Beschreibung | regcmp() kompiliert den regulären Ausdruck, der durch die Konkatenation der Argumente entsteht. Das Ende der Argumentkette ist ein Nullzeiger. Als Ergebnis gibt regcmp() einen Zeiger auf den in ein internes Format übersetzten Ausdruck zurück. Der Speicherplatz für den kompilierten Ausdruck wird mit malloc() bereitgestellt. Der Benutzer ist für die Freigabe des so zugewiesenen Speicherplatzes verantwortlich, wenn der Platz nicht mehr benötigt wird. Die Rückgabe eines Nullzeigers durch regcmp() zeigt an, dass ein Argument einen ungültigen Wert hat..
regex() sucht ein durch regcmp() kompiliertes Muster re in der Zeichenkette subject. Zusätzliche Argumente werden an regex() übergeben, um übereinstimmende Teilausdrücke zurückzuerhalten. Werden nicht genügend Argumente für alle zurückgelieferten Treffer angegeben, ist das Verhalten von regex() undefiniert.
Der globale Zeichenzeiger _loc1 weist auf das erste übereinstimmende Byte in subject. regcmp() und regex() wurden weitgehend vom Editor ed() übernommen, wobei Syntax und Semantik jedoch leicht verändert wurden. Die gültigen Symbole und ihre jeweiligen Bedeutungen sind wie folgt:
[]*.^ | Diese Symbole haben dieselbe Bedeutung wie in ed() . | $
| Dieses Symbol entspricht dem Ende der Zeichenkette (\n entspricht einem NEWLINE-Zeichen). | - | Das von Klammern umschlossene Minuszeichen bedeutet 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 passt beispielsweise der Ausdruck []-] zu 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] *. | { m } { m, } { m,u } |
| Mit {} umschlossene 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 muss 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 Operationen mit dem Plus-Zeichen + und dem Stern * sind gleichbedeutend 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. Ein Operator, z.B. *, + , {} , kann auf Einzelzeichen oder auf einen von Klammern umschlossenen regulären Ausdruck angewendet werden. Beispiel: (a*(cb+)*)$0 . | Alle oben definierten Symbole sind Sonderzeichen. Daher müssen sie mit einem Gegenschrägstrich \ gekennzeichnet werden, wenn sie für sich stehen sollen. |
Returnwert | für regcmp() : Zeiger auf den kompilierten regulären Ausdruck |
|
| bei Erfolg. |
| Nullzeiger | bei Fehler. errno wird gesetzt, um den Fehler anzuzeigen. |
| für regex() : Zeiger auf das nächste Zeichen in subject, das nicht zum Muster passt
|
|
| bei Erfolg. |
| Nullzeiger | bei Fehler. |
Fehler | regcmp() schlägt fehl, wenn gilt:
|
| ENOMEM
| Es steht nicht mehr genügend Speicherplatz zur Verfügung. |
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 Übersetzung die Bibliothek libgen dazubinden (cc -lgen ). |
Beispiel 1 | Das folgende Beispiel sucht ein führendes NEWLINE-Zeichen in der Zeichenkette subject , auf die cursor zeigt.
char *cursor, *newcursor, *ptr;
...
newcursor = regex((ptr = regcmp("^\n", (char *)0)), cursor);
free(ptr);
|
Beispiel 2 | Das folgende Beispiel sucht nach der Zeichenkette Testing3 und gibt die Adresse des Zeichens hinter dem letzten passenden Zeichen (dem Zeichen 4 ) zurück. Die Zeichenkette Testing3 wird in das Zeichenfeld 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);
|
Beispiel 3 | Bei diesem Beispiel wird ein vorübersetzter regulärer Ausdruck in file.i (siehe regcmp() gegen string geprüft.
#include "file.i"
char *string, *newcursor;
...
newcursor = regex(name, string);
|
Siehe auch | re_comp() , re_exec() , malloc() .
|