Die in regulären Ausdrücken verwendeten Funktionen sind wie folgt definiert. Verwenden Sie diese, um eine Suche mit regulären Ausdrücken durchzuführen.
#include<regex.h>
int regcomp(regex_t *preg, const char *regex, int cflags);
int regexec(const regex_t *preg, const char *string, size_t nmatch,regmatch_t pmatch[], int eflags);
size_t regerror(int errcode, const regex_t *preg, char *errbuf,size_t errbuf_size);
void regfree(regex_t *preg);
step1 Verwenden Sie zunächst regcomp, um die Zeichenfolge für reguläre Ausdrücke zu kompilieren, damit sie mit Regexec verwendet werden kann. Geben Sie die Zeichenfolge für reguläre Ausdrücke in Regex an, und die kompilierte Zeichenfolge wird in preg gespeichert. cflag ist ein Flag, das Regexec beeinflusst. Die Bedeutung ist in der folgenden Tabelle angegeben.
cflag | Bedeutung |
---|---|
REG_EXTENDED | Suche mit erweiterten regulären Ausdrücken. |
REG_ICASE | Fall ignorieren. |
REG_NOSUB | Sagen Sie nicht die übereinstimmende Position. |
REG_NEWLINE | Ordnen Sie Zeilenumbrüche nicht Operatoren zu, die allen Zeichen entsprechen. |
step2 Verwenden Sie als Nächstes regexec, um zu suchen.
Geben Sie für preg eine Zeichenfolge an, die den Suchbereich dessen darstellt, was mit regcomp kompiliert wurde. nmatch und pmatch [] werden verwendet, um die übereinstimmende Position zu erhalten. Eflags sind Flags, die sich auf Regexec auswirken. Die Bedeutung ist in der folgenden Tabelle angegeben.
eflag | Bedeutung |
---|---|
REG_NOTBOL | Der Operator, der dem Zeilenanfang entspricht, schlägt fehl. |
REG_NOTEOL | Der Operator, der dem Zeilenende entspricht, schlägt fehl. |
regexec gibt bei einem Fehler REG_NOMATCH zurück. Es gibt auch REG_NOMATCH zurück, wenn keine übereinstimmende Zeichenfolge vorhanden ist.
step3
Da regcomp den Mallock-Bereich in der Struktur regex_t speichern soll, wird es schließlich mit regfree freigegeben, um ihn freizugeben.
regcomp ist so konzipiert, dass bei einem Fehler ein Fehlercode zurückgegeben wird. Verwenden Sie regerror, um diesen Fehlercode in eine Zeichenfolge zu konvertieren.
Machen wir so etwas wie einen grep-Befehl.
example.c
#include <stdio.h>
#include <stdlib.h>
#include <regex.h>
int main(int argc, char *argv[]) {
if (argc != 3) {
fprintf(stderr, "usage:\n%s PATTERN FILENAME\n", argv[0]);
exit(1);
}
int err;
char err_str_buf[4096] = {0};
// STEP1
regex_t patbuf;
err = regcomp(&patbuf, argv[1], REG_EXTENDED | REG_NOSUB | REG_NEWLINE);
if (err != 0) {
regerror(err, &patbuf, err_str_buf, sizeof(err_str_buf));
fprintf(stderr, "regcomp: %s\n", err_str_buf);
exit(1);
}
FILE *fp;
char buf[1024] = {0};
fp = fopen(argv[2], "r");
if (fp == NULL) {
perror(argv[1]);
exit(1);
}
//STEP2
while(fgets(buf, sizeof(buf), fp)) {
if (regexec(&patbuf, buf, 0, NULL, 0) == 0) {
fputs(buf, stdout);
}
}
//STEP3
regfree(&patbuf);
fclose(fp);
return 0;
}
Ausführungsergebnis
$ gcc -o example_program example.c
$ ./example_program reg.* example.c
#include <regex.h>
regex_t patbuf;
err = regcomp(&patbuf, argv[1], REG_EXTENDED | REG_NOSUB | REG_NEWLINE);
regerror(err, &patbuf, err_str_buf, sizeof(err_str_buf));
fprintf(stderr, "regcomp: %s\n", err_str_buf);
if (regexec(&patbuf, buf, 0, NULL, 0) == 0) {
regfree(&patbuf);
https://linuxjm.osdn.jp/html/LDP_man-pages/man3/regex.3.html
Recommended Posts