2009-10-27 24 views
14

Sono passati 10 anni da quando ho guardato c. Devo scrivere un piccolo programma in c che analizzi una stringa. Volevo usare espressioni regolari da quando li uso da anni, ma non ho idea di come farlo in c. Ho passato la mattinata su Google e non riesco a trovare esempi pratici (ad esempio, utilizzare questa libreria, questa è la metodologia). Qualcuno può darmi un semplice esempio?c espressione regolare howto

Grazie!

risposta

38

È possibile utilizzare PCRE:

La libreria PCRE è un insieme di funzioni che implementano modello di espressione regolare corrispondenza utilizzando la stessa sintassi e semantica di Perl 5. PCRE ha una propria API native, così come un set di funzioni wrapper che corrispondono all'API di espressione regolare POSIX. La libreria PCRE è gratuita, anche per la creazione di software commerciale.

Vedere pcredemo.c per un esempio PCRE.

Se non è possibile utilizzare PCRE, il supporto POSIX regular expression è probabilmente disponibile sul sistema (as @tinkertim pointed out). Per Windows, è possibile utilizzare gnuwin Regex for Windows package.

La documentazione regcomp include il seguente esempio:

#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, anche se POSIX esiste, PCRE è disponibile su quasi tutti i sistemi moderni. –

+0

Grazie! Mi dà un buon punto di partenza. – jeffkolez

+0

Questa è una risposta piacevole, utile e collaborativa. Spero che questa domanda riceva voti più alti, dato che la regex in C può essere complicata a seconda della piattaforma. –

0

Un'altra opzione oltre ad una libreria nativa C è quello di utilizzare un'interfaccia in un'altra lingua come Python o Perl. Non avendo a che fare con la gestione delle stringhe di C, e il miglior supporto linguistico per le regex dovrebbe rendere le cose molto più facili per te. È inoltre possibile utilizzare uno strumento come SWIG di generare wrapper per chiamare il codice C.

+0

Riflettere su un altro programma non dovrebbe mai essere una buona idea a meno che non sia assolutamente l'unico modo per eseguire l'operazione. –

+0

@NathanAdams nulla in questa risposta riguarda il bombardamento su un altro programma. – hobbs

6

Se costretti in POSIX solo (senza PCRE), ecco un bocconcino di ripiego:

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

si potrebbe chiamare in questo modo:

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

ho altamente consiglio di fare uso di PCRE se disponibili. Ma è bello controllarlo e avere una sorta di ripiego.

Ho estratto i frammenti da un progetto attualmente nel mio editor. È solo un esempio di base, ma offre tipi e funzioni per cercare se ne hai bisogno. Questa risposta più o meno aumenta la risposta di Sinan.

+0

Grazie - bei esempi.Non sono ancora sicuro dell'ambiente, quindi è utile avere un backup nel caso in cui PCRE non sia disponibile. – jeffkolez

+1

@jeffkolez Buona fortuna per il tuo progetto. 10 anni da quando hai toccato C .. ed eccoti in uno dei suoi angoli bui. Se decidi di sparare al tuo computer, considera prima di acquistare una pistola NERF. –

0

Si dovrebbe anche dare un'occhiata alla libreria regex. Usa espressioni regolari come quelle che puoi scrivere nella shell di Linux.

Per maggiori informazioni, sotto Linux, tipo "uomo regcomp" senza virgolette

+0

Questo non aggiunge nuove informazioni a ciò che è già disponibile in altre risposte. –