2009-10-27 6 views
14

Cela fait 10 ans que j'ai regardé c. J'ai besoin d'écrire un petit programme en c qui analyse une chaîne. Je voulais utiliser des expressions régulières depuis que je les utilise depuis des années, mais je n'ai aucune idée de comment faire ça en c. J'ai passé la matinée à googler et je ne trouve pas d'exemples simples (c'est-à-dire utiliser cette bibliothèque, c'est la méthodologie). Quelqu'un peut-il me donner un exemple simple?c expression régulière howto

Merci!

Répondre

38

Vous pouvez utiliser PCRE:

La bibliothèque PCRE est un ensemble de fonctions qui mettent en œuvre modèle d'expression régulière correspondant à l'aide de la même syntaxe et sémantique que Perl 5. PCRE a sa propre API native, ainsi que ensemble de fonctions wrapper 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 POSIX regular expression est probablement disponible sur votre système (as @tinkertim pointed out). Pour Windows, vous pouvez utiliser le gnuwin Regex for Windows package.

La documentation regcomp comprend l'exemple suivant:

#include <regex.h> 

/* 
* Match string against the extended regular expression in 
* pattern, treating errors as no match. 
* 
* Return 1 for match, 0 for no match. 
*/ 

int 
match(const char *string, char *pattern) 
{ 
    int status; 
    regex_t re; 

    if (regcomp(&re, pattern, REG_EXTENDED|REG_NOSUB) != 0) { 
     return(0);  /* Report error. */ 
    } 
    status = regexec(&re, string, (size_t) 0, NULL, 0); 
    regfree(&re); 
    if (status != 0) { 
     return(0);  /* Report error. */ 
    } 
    return(1); 
} 
+0

+1, bien que Posix existe, PCRE est disponible sur presque tous les systèmes modernes. –

+0

Merci! Cela me donne un bon point de départ. – jeffkolez

+0

Ceci est une réponse agréable, utile et coopérative. J'espère que cette question recevra plus de votes, car regex en C peut être difficile en fonction de la plate-forme. –

0

Une autre option en plus d'une bibliothèque C native est d'utiliser une interface à une autre langue comme Python ou Perl. Ne pas avoir à gérer la gestion des chaînes de caractères de C, et le meilleur support de langage pour regex devrait rendre les choses beaucoup plus faciles pour vous. Vous pouvez également utiliser un outil comme SWIG pour générer des wrappers pour appeler le code de C.

+0

L'obtention d'un autre programme ne devrait jamais être une bonne idée à moins que ce soit absolument la seule façon d'accomplir la tâche. –

+0

@NathanAdams Rien dans cette réponse ne concerne le bombardement d'un autre programme. – hobbs

6

Si forcé dans POSIX uniquement (pas PCRE), voici une friandise de repli:

#include <regex.h> 
#include <stdbool.h> 

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 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 très recommande de faire usage de PCRE si elle est disponible. Mais, c'est agréable de vérifier pour cela et avoir une sorte de repli.

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

+0

Merci - de bons exemples.Je ne suis pas encore sûr de l'environnement, donc c'est pratique d'avoir une sauvegarde en cas PCRE n'est pas disponible. – jeffkolez

+1

@jeffkolez Bonne chance pour votre projet. 10 ans depuis que vous avez touché C .. et vous voilà dans l'un de ses coins sombres. Si vous choisissez de tirer sur votre ordinateur, veuillez d'abord acheter un pistolet NERF. –

0

Vous devriez également jeter un oeil à la bibliothèque regex. Il utilise des expressions régulières comme celles que vous pouvez écrire dans Linux Shell.

Pour plus d'informations, sous Linux, le type "homme regcomp" sans les guillemets

+0

Cela n'ajoute aucune nouvelle information à ce qui est déjà disponible dans les autres réponses. –