Il piano didattico del primo anno del corso di laurea triennale in Informatica, presso l’Universit√† degli Studi di Milano, include l’insegnamento di Linguaggi formali e automi. Uno degli argomenti fondamentali √® la grammatica formale, che trova applicazione nelle espressioni regolari di Unix. Sebbene ci siano numerosi materiali didattici online che catturano l’attenzione dei principianti, una risorsa imprescindibile, nonch√© testo di riferimento per il corso stesso, √® “Introduction to Automata Theory, Languages and Computation” di Hopcroft e Ullman del 1979 (tradotto anche in italiano).

Poich√© il corso inizia nei freddi giorni di febbraio, posso posticipare la lettura e la discussione di questo autentico capolavoro letterario ai primi mesi del nuovo anno. Pertanto, ho ritenuto opportuno iniziare lo studio oggi dai siti web che trattano in modo rigoroso l’uso delle espressioni regolari nel linguaggio di programmazione Go (o Golang, per gli amici), insegnato nel primo semestre accademico. √ą ragionevole presumere che il lettore abbia gi√† una certa familiarit√† con questo linguaggio.

La mia ricerca mi ha condotto al sito ufficiale di Go, ricco di informazioni su ogni aspetto tecnico e pratico del linguaggio, dove l’implementazione della ricerca tramite espressioni regolari √® trattata in modo esaustivo. Il pacchetto di riferimento √® chiamato ‘regexp’ e fa parte della libreria standard.

Espressioni regolari secondo Google Link to heading

Un’espressione regolare definisce un insieme di stringhe; se una qualsiasi di queste stringhe appartiene a tale insieme, si afferma che l’espressione regolare corrisponde (preferibilmente si pu√≤ dire coincide o si abbina) alla stringa. In inglese si usa il termine matches.

Definizione Link to heading

(Paul Wankadia). Le espressioni regolari sono una notazione per descrivere insiemi di stringhe di caratteri.


Un letterale √® l’espressione regolare pi√Ļ semplice ed √® formata da un singolo carattere alfanumerico. Fatta eccezione per i metacaratteri (quelli che assumono un significato particolare nell’espressione regolare), i letterali coincidono sempre con s√© stessi. Ovunque √® necessario il significato letterale di un metacarattere, anzich√© la sua propriet√† di linguaggio regolare, occorre anteporgli una barra rovesciata. Per esempio, i seguenti caratteri sono considerati metacaratteri: * + ? () |

Proposizione Link to heading

(Paul Wankadia). Due espressioni regolari possono essere scambiate oppure concatenate per formare una nuova espressione regolare.


Si supponga di avere due espressioni regolari e1, e2, in modo tale che e1 coincida con la stringa s e l’espressione e2 coincida con t, allora l’espressione regolare che si ottiene accostando e1, il metacarattere | e l’espressione regolare e2, cio√® e1|e2, coincide con la stringa s oppure con la stringa t. Invece l’espressione regolare che si ottiene concatenando e1 ed e2, cio√® e1e2, coincide con la stringa st.

Volendo mettere in pratica quanto appena esposto, scriviamo il seguente programma che usa la struttura Regexp e il metodo MatchString per rappresentare una espressione regolare e riscontrare se essa coincide con una stringa.

Programma Link to heading

Dopo aver precisato la clausola di programma e la dichiarazione che importa i due pacchetti della libreria standard, fmt e regexp, si procede definendo nel blocco main due variabili di tipo stringa e1, e2 per memorizzare le espressioni regolari ho e tel; a questo punto si chiama il metodo MustCompile della struttura Regexp per compilare l’espressione regolare e1 e si eseguono alcune semplici ricerche: MustCompile pu√≤ essere considerato il costruttore dell’oggetto Regexp con il quale √® poi possibile effettuare una serie di operazioni su stringhe con il metodo MatchString, in questo caso tutte abbastanza semplici. La prima operazione cerca nella stringa ad hoc l’espressione ho e siccome c’√® un riscontro (quarto e quinto letterale), il programma stampa true (vero); nella seconda il riscontro fallisce in quanto la stringa otel non coincide in nessun punto con l’espressione compilata ho e il programma stampa false (falso).

Abbiamo quindi raggiunto i seguenti risultati:

  • c’√® un riscontro tra l’espressione regolare e1=ho e la stringa ad hoc.

  • Non c’√® nessun riscontro tra l’espressione regolare e1=ho e la stringa otel.

Il passo successivo √® provare l’alternativa tra le espressioni regolari e1, e2. A tal scopo, viene creata (ma sarebbe persino superfluo) una nuova variabile e3 di tipo stringa per memorizzare l’espressione regolare e1|e2 tramite l’operazione di concatenazione permessa dal linguaggio di programmazione e si ricompila con il metodo ormai noto. Si compiono quattro ricerche: si cerca per ho oppure tel in ote, ma fallisce perch√© la stringa non appartiene all’insieme descritto dall’espressione regolare e3; la seconda ricerca porta i suoi frutti, l’espressione regolare e2=tel (che fa parte di e3) combacia con gli ultimi tre letterali di otel; la terza ricerca ha successo, infatti viene riscontrata l’espressione regolare e1=ho in hote; anche l’ultima operazione ha un esito positivo, di nuovo e1=ho √® presente in hotel e questo e sufficiente per il programma.

I seguenti risultati sono stati raggiunti:

  • non c’√® nessun riscontro tra la stringa ote e l’espressione regolare e1=ho e neppure con e2=tel.

  • Viene riscontrata l’espressione e2=tel in otel

  • Viene riscontrata l’espressione e1=ho in hote

  • Viene riscontrata l’espressione e1=ho in hotel

Chiaramente questo modo di procedere, riscrivendo e ricompilando le espressioni, è ripetitivo e laborioso, seppure istruttivo. Fortunatamente esistono programmi, sia da riga di comando sia con interfaccia grafica, che permettono ricerche avanzate con le espressioni regolari su stringhe di testo. Inoltre, esistono applicazioni Web per costruirle e verificarne la correttezza: tutte hanno un grande impatto positivo sul lavoro del programmatore. Infine, consapevole di aver dato per scontate molte nozioni di programmazione, mi impegno a ritornare su questo argomento affascinante, sperando di riuscire a esaminarne ogni aspetto in dettaglio.


Per aggiornamenti e correzioni, scarica il PDF free di questo articolo. Licenza GNU FDL