[LINUX] Utiliser des expressions régulières en C

Les fonctions utilisées dans les expressions régulières sont définies comme suit. Utilisez-les pour effectuer une recherche à l'aide d'expressions régulières.

#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 Tout d'abord, utilisez regcomp pour compiler la chaîne d'expression régulière afin qu'elle puisse être utilisée avec regexec. Spécifiez la chaîne de caractères d'expression régulière dans regex, et celle compilée est stockée dans preg. cflag est un indicateur qui affecte regexec. La signification est indiquée dans le tableau ci-dessous.

cflag sens
REG_EXTENDED Recherche avec des expressions régulières étendues.
REG_ICASE Ignorez la casse.
REG_NOSUB Ne dites pas la position correspondante.
REG_NEWLINE Ne faites pas correspondre les sauts de ligne avec des opérateurs qui correspondent à tous les caractères.

step2 Ensuite, utilisez regexec pour rechercher.

Pour preg, spécifiez une chaîne de caractères correspondant à la plage de recherche de ce qui a été compilé avec regcomp. nmatch et pmatch [] sont utilisés pour obtenir la position correspondante. Les eflags sont des indicateurs qui affectent regexec. La signification est indiquée dans le tableau ci-dessous.

eflag sens
REG_NOTBOL L'opérateur qui correspond au début de la ligne échoue.
REG_NOTEOL L'opérateur qui correspond à la fin de la ligne échoue.

regexec renvoie REG_NOMATCH en cas d'échec. Il renvoie également REG_NOMATCH s'il n'y a pas de chaîne correspondante.

step3

Puisque regcomp est censé enregistrer la zone mallockée dans la structure regex_t, il est finalement publié avec regfree pour le publier.

La gestion des erreurs

regcomp est conçu pour renvoyer un code d'erreur en cas d'échec. Utilisez regerror pour convertir ce code d'erreur en une chaîne.

Exemple

Faisons quelque chose comme une commande grep.

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

Résultat d'exécution

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

référence

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

Recommended Posts

Utiliser des expressions régulières en C
N'utilisez pas \ d dans les expressions régulières Python 3!
Comment utiliser les expressions régulières en Python
Lors de l'utilisation d'expressions régulières en Python
Chevauchement d'expressions régulières en Python et Java
[C] Utilisez qsort ()
Comment utiliser Google Test en langage C
[Python] Expressions régulières Expressions régulières
Remplacer non-ASCII par des expressions régulières en Python
Comment utiliser la bibliothèque C en Python
Un chercheur d'une société pharmaceutique a résumé les expressions canoniques en Python
100 Traitement du langage Knock Expressions régulières apprises au chapitre 3
Supprimer les chaînes supplémentaires dans l'URL avec une expression canonique
Expression régulière dans regex.h
Gérer les signaux en langage C
Utilisez config.ini avec Python
Utiliser DataFrame en Java
Utiliser des dates en Python
Accéder à MongoDB en C
Next Python en langage C
Utiliser ujson dans les requêtes
Utiliser le profileur en Python
API C en Python 3
Expression régulière en Python
Étendre python en C ++ (Boost.NumPy)
Expression de régression multiple en Python
Voyons comment utiliser def en python
Intégration du langage machine en langage C
Tri de tas fait en langage C
Utiliser Anaconda dans un environnement pyenv
Utiliser le protocole de mesure avec Python
Utiliser la fonction de rappel en Python
Utiliser le magasin de paramètres en Python
Utiliser le cache HTTP en Python
Utilisez l'ODM de MongoDB avec Python
Utiliser un dict clé de liste en Python
Utiliser Random Forest avec Python
Imiter Numpy de Python en C #
Recherche binaire en Python / C ++
AtCoder Regular Contest # 002 Problème C
Comment créer et utiliser des bibliothèques statiques / dynamiques en langage C
Utilisez Spyder de Python IDE
Envelopper de longues expressions en python
Extraire des nombres avec des expressions régulières
Utilisons Juman ++ en mode serveur
À propos de Python et des expressions régulières
Arborescence de surface totale minimale en C #
-Solution pour l'adresse déjà utilisée
Un mémo qui gère les guillemets doubles pleine largeur avec les expressions régulières Python
Expressions régulières faciles et solides à apprendre en Python
Utilisez <input type = "date"> avec Flask
Utilisez le modèle jinja2 dans un fichier Excel
Ecrire un test piloté par table en C
Test de module multi-instance en langage C
Utilisez le tissu tel quel en python (fabric3)
3.6 Normalisation de texte