Informatica di base

A cosa servono le espressioni regolari?

Autore

Manuel Ricci

Per spiegare le espressioni regolari penso sia corretto parlare un pochino della loro storia. Siamo nell’anno 1943, quando Warren McCulloch e Walter Pitts iniziano a sviluppare un modello che descrive come il sistema nervoso umano funzioni.

La ricerca si focalizzava principalmente sulla creazione di pattern complessi. Nel 1951 il matematico Stephen Kleene descrisse con un espressione matematica il modello McCulloch-Pitts usando quelle che hai tempi venivano chiamate regular sets.

Il nome espressione regolare e il loro impiego effettivo in un applicativo dovrà attendere ancora 15 anni. Infatti è nel 1966 che Ken Thompson estende l’editor QED, sviluppato originariamente da Lampson e Deutsch, influenzato dalla nozione di Kleen, affinché potesse comprendere le regular expression.

Ai più Ken Thompson non dice granché, ma è famoso per essere stato uno degli autori di Multics, antenato dei moderni sistemi operativi Unix-Like.

La storia e la carriera di Thompson si intreccia con altre persone illustri dell’informatica, in particolare Dennis Ritchie, noto per aver scritto insieme a Brian Kernighan, il libro più famoso dell’informatica, “The C Programming Language”.

Le espressioni regolari oggi

Dal 1966 ad oggi di cose ne sono cambiate e considerano che l’informatica ogni 3 anni diventa obsoleta, pensare che le espressioni regolari sono in giro da quasi 60 fa pensare parecchio alla loro enorme utilità.

Oggi le espressioni regolari sono presenti in praticamente tutti i principali linguaggi di programmazione, come: Python, JavaScript, Java, Ruby, PHP, C, C++, C#, PERL, ecc.

Addirittura in HTML si possono usare le espressioni regolari, grazie all'attributo pattern dell’elemento input.

Ritornando un attimo nel mondo Unix, uno dei più noti comandi eseguibili da riga di comando (o terminale che dir si voglia) è grep, il quale è acronimo di “search Globally for line matching the Regular Expression, and Print them”.

A questo punto però viene naturale chiedersi

A cosa servono le espressioni regolari?

Le espressioni regolari servono a cercare e sostituire qualcosa in una stringa.

Più nello specifico possiamo usare le espressioni regolari per comprendere se una stringa è stata scritta nel modo corretto, basti pensare ad esempio a:

  • Codice fiscale
  • CAP
  • Date
  • Indirizzo di posta elettronica
  • Numeri di carta di credito

O per estrarre una sottostringa, come ad esempio:

  • Le prime cifre della carta di credito per determinarne il circuito
  • Verificare che nel testo sia presente una parola specifica

E proprio su quest’ultimo caso, voglio basare un primo esempio pratico.

Esempio di regular expression

Supponiamo di avere la seguente frase:

Il gatto nero saltò sul tavolo e iniziò a leccare la ciotola del cibo. Il cane abbaiò e corse verso il gatto, ma il gatto riuscì a scappare. Il cane si arrese e tornò a dormire sul pavimento.

Il nostro compito è quello di individuare la parola nero.

Proviamo prima a raggiungere l’obiettivo con le espressioni regolari.

Io qui di seguito utilizzo JavaScript, l’invito è ovviamente quello di provare prima per i fatti propri e poi confrontarsi e l’invito è ovviamente anche quello di declinare l’esempio nel vostro linguaggio di riferimento.

Prima di procedere tenete a mente tre cose:

  1. La parola deve essere nero e non abanero o nerone, quindi attenzione ai caratteri che precedono e seguono la parola che state cercando
  2. Chi ha scritto il testo potrebbe essere stato fantasioso e aver utilizzato lettere maiuscole e minuscole non solo all’inizio.
  3. La parola può essere preceduta o seguita da spazi, punteggiatura o simboli di vario genere, senza contare che potrebbe trovarsi all’inizio o alla fine della frase stessa.

La situazione si è complicata un po’ dalla semplice ricerca della parola nero, ma niente di impossibile.

Qui vi invito a fermarvi e riflettere, provate ad implementare per i fatti vostri la soluzione e poi proseguite. La soluzione può essere più o meno completa, ma l’importante è che ci proviate.

Fatto? Bene, allora possiamo proseguire

La soluzione in pseudocodice

Per essere i più agnostici possibili sul linguaggio da impiegare includerò sempre, anche in futuro, esempi in pseudocodice.

1ciclo: fai scorrere I per tutta la lunghezza di T
2   se il carattere I è "n" o "N"
3      se il carattere I+1 è "e" o "E"
4         se il carattere I+2 è "r" o "R"
5            se il carattere I+3 è "o" o "O"
6               se il carattere I-1 è 0 o non è una lettera
7                  se il carattere I+4 è maggiore di T o non contiene lettere
8                     mostra I

Dove I sta per l’indice e T è il testo.

In JavaScript l’avrei scritta più o meno così

1const text = "Il gatto nero saltò sul tavolo e iniziò a leccare la ciotola del cibo. Il cane abbaiò e corse verso il gatto, ma il gatto riuscì a scappare. Il cane si arrese e tornò a dormire sul pavimento.";
2
3for ( let i = 0; i < text.length; i++ ) {
4    if ( text[i] === "n" || text[i] === "N" ) {
5        if ( text[i + 1] === "e" || text[i + 1] === "E" ) {
6            if ( text[i + 2] === "r" || text[i + 2] === "R" ) {
7                if ( text[i + 3] === "o" || text[i + 3] === "O" ) {
8                    if ( i === 0 || text[i - 1] === " " ) {
9                        if ( i + 4 === text.length || text[i + 4] === " " ) {
10                            console.log( "Il testo contiene la parola 'nero'" );
11                            break;
12                        }
13                    }
14                }
15            }
16        }
17    }
18}

Come detto prima, quello che sembrava un compito semplice, in realtà si è rivelato essere un bel lavoraccio, ma hey! Mica siamo nel 1965, abbiamo le espressioni regolari dalla nostra parte.

Per fare la stessa cosa con una regular espression possiamo scrivere semplicemente:

1\bnero\b

Il gioco è fatto. Semplice vero?

Se vi state domandando cosa vogliono dire quei caratteri che ho scritto, \b è un terminatore di parola, la b sta per boundary e può essere qualunque carattere che non appartenga ad una parola come un punto, una virgola, delle virgolette o un punto di domanda.

Dove testare le espressioni regolari

Durante le prossime lezioni userò regex101.com, un strumento estremamente comodo per costruire, testare e fare il debug delle espressioni regolari.

Delle alternative possono essere:

Conclusioni

Questa è la storia e una primissima introduzione alle espressioni regolari, nella prossima lezione cerchiamo di capire meglio quel \b e andiamo alla scoperta di tutti i caratteri speciali che possono esserci in un espressione regolare.

Caricamento...

Diventiamo amici di penna? ✒️

Iscriviti alla newsletter per ricevere una mail ogni paio di settimane con le ultime novità, gli ultimi approfondimenti e gli ultimi corsi gratuiti puubblicati. Ogni tanto potrei scrivere qualcosa di commerciale, ma solo se mi autorizzi, altrimenti non ti disturberò oltre.

Se non ti piace la newsletter ti ricordo la community su Discord, dove puoi chiedere aiuto, fare domande e condividere le tue esperienze (ma soprattutto scambiare due meme con me). Ti aspetto!

Ho in previsione di mandarti una newsletter ogni due settimane e una commerciale quando capita.