View Full Version : [C] Espressioni regolari
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. :)
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'.
Grazie mille andbin ;)
Sempre molto preziosi i tuoi consigli. Consultero la man page. Ciao. :)
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:
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:
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
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.