PDA

View Full Version : [C] Espressioni regolari


Manugal
22-12-2006, 15:13
Ciao a tutti!!

Devo implementare una shell minimale. Tra le caratteristiche di tale shell c'è anche il filename expansion. Il prof. ci ha consigliato di usare la libreria regex.h per trattare le varie espressioni regolari. Il problema è che non ho capito bene cosa fanno le funzione regcomp() e regexec() (ed anche su internet le informazioni a riguardo sono molto scarse). Cioè se io sto sulla shell e gli invio questo comando:

> rm *.dat

Come faccio a fargli interpretare l'asterisco attraverso quelle due funzioni? Grazie. :)

andbin
22-12-2006, 16:01
Ciao a tutti!!

Devo implementare una shell minimale. Tra le caratteristiche di tale shell c'è anche il filename expansion. Il prof. ci ha consigliato di usare la libreria regex.h per trattare le varie espressioni regolari. Il problema è che non ho capito bene cosa fanno le funzione regcomp() e regexec() (ed anche su internet le informazioni a riguardo sono molto scarse). Cioè se io sto sulla shell e gli invio questo comando:

> rm *.dat

Come faccio a fargli interpretare l'asterisco attraverso quelle due funzioni? Grazie. :)Le espressioni regolari sono un concetto molto più ampio, potente e complesso rispetto alla semplice espansione dei nomi all'interno della shell.
Quindi se non ci sono delle necessità particolari, trovo poco utile dover utilizzare una libreria apposita per le espressioni regolari.

In Linux esiste una funzione, molto più semplice e comoda: glob(). Che fa il pattern-matching sui file esattamente secondo le regole della shell.

Esempio:
#include <stdio.h>
#include <glob.h>

int main (void)
{
int ret, i;
glob_t gl;

ret = glob ("*.txt", GLOB_ERR | GLOB_NOSORT, NULL, &gl);

if (ret == 0)
{
for (i = 0; i < gl.gl_pathc; i++)
printf ("Trovato: %s\n", gl.gl_pathv[i]);

globfree (&gl);
}
else
printf ("Errore\n");

return 0;
}Naturalmente leggi la documentazione con 'man glob'.

Manugal
23-12-2006, 11:11
Grazie mille andbin ;)

Sempre molto preziosi i tuoi consigli. Consultero la man page. Ciao. :)

Manugal
23-12-2006, 14:56
Una domanda però.

Io ho scritto:


ret=glob(args[i],GLOB_DOOFS | GLOB_NOSORT | GLOB_ERR, NULL, &pglob);


args è un vettore di puntatori a char che contiene gli argomenti. Come argomento gli passo "*.c". Perché dopo che la funzione ha eseguito tutto, pglob.gl_pathv[0] e pglob.gl_pathv[1] sono vuoti? Infatti poi i file *.c che ha trovato me li mette dalla posizione 2 in poi. Non capisco perché. :confused:

andbin
23-12-2006, 18:13
Una domanda però.

Io ho scritto:


ret=glob(args[i],GLOB_DOOFS | GLOB_NOSORT | GLOB_ERR, NULL, &pglob);


args è un vettore di puntatori a char che contiene gli argomenti. Come argomento gli passo "*.c". Perché dopo che la funzione ha eseguito tutto, pglob.gl_pathv[0] e pglob.gl_pathv[1] sono vuoti? Infatti poi i file *.c che ha trovato me li mette dalla posizione 2 in poi. Non capisco perché. :confused:Il flag GLOB_DOOFFS serve per indicare alla glob() di lasciare vuoti un tot di elementi all'inizio dell'array gl_pathv.
Prima di chiamare la glob() bisogna settare il campo gl_offs della struttura indicando quanti 'slot' lasciare liberi.
È spiegato chiaramente nella pagina di man. :read:

Manugal
23-12-2006, 18:38
Ah ecco infatti io avevo settato quella variabile a 2 e giustamente lui ha lasciato vuoti i primi due campi. Ora è tutto chiaro. Grazie. :D