[LINUX] Verwenden Sie reguläre Ausdrücke in C.

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.

Fehlerbehandlung

regcomp ist so konzipiert, dass bei einem Fehler ein Fehlercode zurückgegeben wird. Verwenden Sie regerror, um diesen Fehlercode in eine Zeichenfolge zu konvertieren.

Beispiel

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);

Referenz

https://linuxjm.osdn.jp/html/LDP_man-pages/man3/regex.3.html

Recommended Posts

Verwenden Sie reguläre Ausdrücke in C.
Verwenden Sie \ d nicht in regulären Python 3-Ausdrücken!
Verwendung regulärer Ausdrücke in Python
Bei Verwendung regulärer Ausdrücke in Python
Überlappende reguläre Ausdrücke in Python und Java
[C] Verwenden Sie qsort ()
Verwendung von Google Test in C-Sprache
[Python] Reguläre Ausdrücke Reguläre Ausdrücke
Ersetzen Sie Nicht-ASCII durch reguläre Ausdrücke in Python
Verwendung der C-Bibliothek in Python
Ein Forscher eines Pharmaunternehmens fasste die kanonischen Ausdrücke in Python zusammen
100 Sprachverarbeitung Klopfen Sie auf reguläre Ausdrücke, die Sie in Kapitel 3 gelernt haben
Entfernen Sie zusätzliche Zeichenfolgen in der URL mit kanonischem Ausdruck
Regulärer Ausdruck in regex.h
Verarbeiten Sie Signale in C-Sprache
Verwenden Sie config.ini mit Python
Verwenden Sie DataFrame in Java
Verwenden Sie Datumsangaben in Python
Greifen Sie auf MongoDB in C zu
Weiter Python in C-Sprache
Verwenden Sie ujson in Anfragen
Verwenden Sie den Profiler in Python
C-API in Python 3
Regulärer Ausdruck in Python
Erweitern Sie Python in C ++ (Boost.NumPy)
Mehrfacher Regressionsausdruck in Python
Mal sehen, wie def in Python verwendet wird
Einbettung der Maschinensprache in die Sprache C.
Heap-Sortierung in C-Sprache
Verwenden Sie Anaconda in einer Pyenv-Umgebung
Verwenden Sie das Messprotokoll mit Python
Verwenden Sie die Rückruffunktion in Python
Verwenden Sie den Parameterspeicher in Python
Verwenden Sie den HTTP-Cache in Python
Verwenden Sie in Python ein Diktat mit Listenschlüssel
Verwenden Sie Random Forest mit Python
Nachahmung von Pythons Numpy in C #
Binäre Suche in Python / C ++
AtCoder Regular Contest # 002 C Problem
Erstellen und Verwenden von statischen / dynamischen Bibliotheken in C-Sprache
Verwenden Sie Spyder von Python IDE
Wickeln Sie lange Ausdrücke in Python ein
Zahlen mit regulären Ausdrücken extrahieren
Verwenden wir Juman ++ im Servermodus
Über Python und reguläre Ausdrücke
Minimaler Gesamtflächenbaum in C #
-Lösung für bereits verwendete Adresse
Ein Memo, das doppelte Anführungszeichen in voller Breite mit regulären Python-Ausdrücken verarbeitet
Reguläre Ausdrücke, die in Python leicht und solide zu erlernen sind
Verwenden Sie <input type = "date"> mit Flask
Verwenden Sie die jinja2-Vorlage in einer Excel-Datei
Schreiben Sie einen tabellengesteuerten Test in C.
Modultest mit mehreren Instanzen in C-Sprache
Verwenden Sie Stoff wie in Python (Stoff3)
3.6 Textnormalisierung 3.7 Reguläre Ausdrücke zum Tokenisieren von Text