2011-11-07 12 views
12

Ho esaminato le funzioni regex nella libreria regex POSIX e nella libreria PCRE, ma entrambe non sembrano avere una funzione di sostituzione delle stringhe. Non voglio usare C++, e sarebbe meglio se non ho bisogno di collegare un'altra libreria (ma posso farlo se devo). Devo eseguire manualmente la sostituzione della stringa? In tal caso, come posso utilizzare i gruppi di cattura?Come sostituire le stringhe regex in puro C?

+0

A quali gruppi di cattura si riferisce? Non esiste una libreria C incorporata per la regex, dovrai usare pcre o somithing in questo modo. – lvella

+0

In generale non è possibile eseguire sostituzioni di stringhe all'interno di una stringa C: potrebbe non essere disponibile la memoria. Puoi chiarire che cosa stai cercando di fare esattamente? –

+0

Quindi vuoi che io sia specifico? Ho un'intestazione di richiesta HTTP che voglio usare regex per cambiare e inoltrare al server. – Yifan

risposta

20

regex.h non fornisce supporto nativo per la sostituzione di stringhe, tuttavia fornisce sub-espressioni/gruppi di cattura che lo rendono molto più semplice. Immagino che tu abbia familiarità con le compilation regex e salti per regex l'esecuzione e le sottoespressioni.

regexec() è definito come segue regex.h (/ usr/include /):

extern int regexec (const regex_t *__restrict __preg, 
     const char *__restrict __string, size_t __nmatch, 
     regmatch_t __pmatch[__restrict_arr], 
     int __eflags); 

Il primo, secondo, e gli argomenti finali sono la regex, stringa da eseguire su e bandiere esecuzione , rispettivamente. Il terzo e il quarto argomento sono usati per specificare una matrice di regmatch_t. Un regmatch_t consiste di due campi: rm_so e rm_eo, che sono gli indici, o offset, rispettivamente dell'inizio e della fine dell'area corrispondente. Questi indici possono quindi essere utilizzati insieme a memcpy(), memset() e memmove() da string.h per eseguire la sostituzione di stringhe.

Farò un piccolo esempio e pubblicarlo più tardi.

Buona fortuna, e spero che questo abbia aiutato.

+0

+1 con risposte come questa dovresti avere più di 308 ripetizioni! –

+4

* Farò un piccolo esempio e pubblicarlo più tardi. * Quando? Hai fatto questa promessa 5 anni fa. ; [Ecco qui (http://stackoverflow.com/questions/1085083/regular-expressions-in-c-examples) alcuni esempi che ho trovato finora. –

5

La libreria PCRE non fornisce una funzione di sostituzione, ma è disponibile una funzione wrapper nella pagina di download PCRE che accetta la sintassi perl stile =~ s/pattern/replace/ e quindi utilizza le funzioni native PCRE per eseguire una sostituzione/sostituzione. Vai a http://www.pcre.org/ quindi fai clic sul collegamento Download: ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/, quindi sulla directory Contrib. Il pacchetto/progetto desiderato è: pcrs-0.0.3-src.tar.gz.

Nota che non l'ho usato da solo, quindi non posso testimoniare come funziona. È comunque un pezzo di codice abbastanza piccolo e semplice, quindi potrebbe benissimo servire al tuo scopo.

+0

Ciao, grazie per il link. usa pcrs nel mio programma? Attualmente utilizzo le funzioni pcre_compile e pcre_exec come qui http://stackoverflow.com/a/1421923/1729501 – user13107