c expression régulière howto

Cela fait 10 ans que j’ai regardé c. J’ai besoin d’écrire un petit programme en c qui parsing une chaîne. Je voulais utiliser des expressions régulières depuis des années que je les utilise, mais je ne sais pas comment faire cela en c. J’ai passé la matinée à googler et je ne trouve aucun exemple simple (par exemple, utilisez cette bibliothèque, voici la méthodologie). Quelqu’un peut-il me donner un exemple simple?

Merci!

Vous pouvez utiliser PCRE :

La bibliothèque PCRE est un ensemble de fonctions qui implémentent la correspondance du modèle d’expression régulière en utilisant la même syntaxe et la même sémantique que Perl 5. PCRE dispose de sa propre API native ainsi que d’un ensemble de fonctions d’encapsulation qui correspondent à l’API d’expression régulière POSIX. La bibliothèque PCRE est gratuite, même pour la construction de logiciels commerciaux.

Voir pcredemo.c pour un exemple PCRE.

Si vous ne pouvez pas utiliser PCRE, le support des expressions régulières POSIX est probablement disponible sur votre système ( comme l’a souligné @tinkertim ). Pour Windows, vous pouvez utiliser le package gnuwin Regex pour Windows .

La documentation regcomp comprend l’exemple suivant:

 #include  /* * Match ssortingng against the extended regular expression in * pattern, treating errors as no match. * * Return 1 for match, 0 for no match. */ int match(const char *ssortingng, char *pattern) { int status; regex_t re; if (regcomp(&re, pattern, REG_EXTENDED|REG_NOSUB) != 0) { return(0); /* Report error. */ } status = regexec(&re, ssortingng, (size_t) 0, NULL, 0); regfree(&re); if (status != 0) { return(0); /* Report error. */ } return(1); } 

Si forcé dans POSIX seulement (pas de pcre), voici une friandise de repli:

 #include  #include  bool reg_matches(const char *str, const char *pattern) { regex_t re; int ret; if (regcomp(&re, pattern, REG_EXTENDED) != 0) return false; ret = regexec(&re, str, (size_t) 0, NULL, 0); regfree(&re); if (ret == 0) return true; return false; } 

Vous pourriez l’appeler comme ceci:

 int main(void) { static const char *pattern = "/foo/[0-9]+$"; /* Going to return 1 always, since pattern wants the last part of the * path to be an unsigned integer */ if (! reg_matches("/foo/abc", pattern)) return 1; return 0; } 

Je recommande fortement d’ utiliser PCRE s’il est disponible. Mais, c’est agréable de le vérifier et d’avoir une sorte de solution de rechange.

J’ai extrait les extraits d’un projet actuellement dans mon éditeur. C’est juste un exemple très basique, mais vous donne les types et les fonctions à rechercher si vous en avez besoin. Cette réponse augmente plus ou moins la réponse de Sinan.

Une autre option, outre une bibliothèque C native, consiste à utiliser une interface avec un autre langage tel que Python ou Perl. Ne pas avoir à gérer le traitement des cordes de C et la meilleure prise en charge linguistique des expressions régulières devraient vous faciliter la tâche. Vous pouvez également utiliser un outil tel que SWIG pour générer des wrappers permettant d’appeler le code à partir de C.

Vous devriez également jeter un coup d’œil à la bibliothèque de regex. Il utilise des expressions régulières comme celles que vous pouvez écrire dans le shell Linux.

Pour plus d’informations, sous Linux, tapez “man regcomp” sans les guillemets