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.
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.
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);
https://linuxjm.osdn.jp/html/LDP_man-pages/man3/regex.3.html
Recommended Posts