RegEx

Oggi parliamo di RegEx che sta per Regular Expression o in italiano “espressione regolare”.

Si tratta di stringhe di testo che consentono di estrarre informazioni, mediante corrispondenza, ricerca e ordinamento.

La storia delle espressioni regolari risale al 1950 quando sono state definite dal matematico americano Stephen Cole Kleene. Successivamente, le espressioni regolari sono state implementate per la prima volta dal’informatico Kenneth Lane Thompson nell’editor QED tra il 1966 e il 1967.

Più specificamente, le espressioni regolari possono essere usate per trovare il testo che corrisponde a un dato modello (pattern) e opzionalmente sostituire quelle corrispondenze con nuovo testo. Come vedremo nell’esempio più avanti non esiste una sintassi universale.

Per essere più chiari, immaginiamo un testo dal quale vogliamo estrarre parti di esso oppure controllare la loro esattezza (matching), o ancora cercare un certo contenuto e utilizzare funzioni di cerca e sostituisci. Le sintassi delle RegEx sono note fondamentalmente nei sistemi POSIX e nel linguaggio Perl.

Le RegEx sono spesso considerate molto complesse come emerge dalla vignetta seguente

Credits xkcd - https://xkcd.com/1171/

Per fare un esempio, immaginiamo di voler verificare l’esattezza sintattica di un indirizzo email; sappiamo, infatti, che l’indirizzo email deve rispettare uno standard internazionale che è noto come RFC 5322. Pertanto, l’indirizzo email deve essere conforme ai criteri indicati nella citata RFC 5322.

Quindi, dovremmo utilizzare la seguente RegEx:

^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$

Infatti, con la stringa su menzionata si può verificare, ad esempio, l’indirizzo email sia nel formato

username@dominio.tld

sia come

nome.cognome@dominio.tld

Spieghiamo la sintassi della stringa su riportata:

  • il carattere ^ (accento circonflesso) è definito “ancora” e indica che inizia una stringa regex;
  • la prima parte, e precisamente [a-zA-Z0-9_.+-], indica che lo username può essere composto da qualsiasi carattere alfanumerico, e cioè può contenere caratteri dalla “a” alla “z”, minuscoli o maiuscoli, può contenere numeri, il punto e/o il trattino.
  • il segno + indica una o più occorenze e quindi segue il simbolo @;
  • la seconda parte [a-zA-Z0-9-]+\. fa riferimento al dominio e indica - come già detto per lo username, che può essere composto da qualsiasi carattere alfanumerico, e cioè può contenere caratteri dalla “a” alla “z”, minuscoli o maiuscoli, può contenere numeri e che ci deve essere il punto;
  • il successivo segno + indica che al dominio segue altra stringa;
  • la stringa finale \.[a-zA-Z0-9-.]+ indica la composizione del TLD con la stessa logica seguita per lo username;
  • il carattere $ è definito “ancora” (come il simbolo ^ e indica la chiusura della stringa regex.

Precisiamo che non esiste un’unica formulazione della stringa regex per il controllo dell’indirizzo email; infatti, riportiamo di seguito altri esempi con i quali si raggiunge lo stesso obiettivo.

^([a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6})*$

oppure

^([a-z0-9_\.\+-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$

La verifica dell’indirizzo email non è da considerare semplicisticamente, perché potrebbero esserci svariate ragioni che ci inducono a effettuare un controllo, dalla esattezza della sintassi a esigenze di sicurezza.

Gli editor RegEx

Le regex devono rispettare una sintassi e in rete ci sono diversi tool gratuiti che consentono di verificare la loro esattezza. Ne menzioniamo alcuni disponibili online:

  1. Regular Expressions 101
  2. RegEx Testing from Dan’s Tools
  3. RexExr
  4. Cooding.Tools
  5. pythex

Tuttavia, ci sono anche editor RegEx da utilizzare come app sulla propria macchina per le attività necessarie.

In informatica le RegEx sono fondamentali e vengono utilizzate per diverse finalità, tra le quali, ad esempio, le ricerche all’interno di database SQL oppure per Google Analytics, web server Apache, calcolo dei codici fiscali, codice HTML, ecc.

grep e RegEx

Dopo la creazione delle regex è stata realizzato il global regular expression print (grep) che è un’applicazione indipendente facente parte dei comandi dei sistemi operativi UNIX based.

In realtà, grep è un applicativo del sistemi Portable Operating System Interface for Unix (POSIX), famiglia di standard internazionale definiti da IEEE per i sistemi operativi c.d. Unix-like tra i quali c’è anche macOS, ed è descritto dalla norma ISO/IEC 9945.

Chi ha familiarità con sistemi operativi Linux e macOS sa bene quali sono le funzioni di grep e le sue potenzialità.

E’ sufficiente richiamare l’help con il comando grep --help per avere a disposizione la sintassi da utilizzare. Peraltro, in rete ci sono moltissime risorse che spiegano molto bene la sintassi da utilizzare con grep.

In sintesi, grep consente di cercare una certa stringa all’interno di uno o più file.

Infatti, digitando il comando

grep testo nomefile

verrà avviata la ricerca di ciò che abbiamo indicato come “testo” all’interno del file che - per semplificare - abbiamo indicato come “nomefile”.

La sintassi di grep ci consente di estendere la ricerca anche a più file come nell’esempio che segue:

grep testo nomefile1 nomefile2 nomefile3

All’interno di una cartella possiamo utilizzare il comando

grep testo *

per avviare la ricerca del “testo” in tutti i file che sono presenti nella cartella stessa.

Possiamo anche avviare una ricerca all’interno della cartella e di tutte le altre che sono all’interno con il comando

grep -r testo *

Non continuiamo con l’elencazione dei diversi comandi di grep perché si possono recuperare dall’help o dalle numerose risorse online, come abbiamo detto.

In conclusione, grep è una risorsa davvero molto utile per chi deve eseguire delle ricerche all’interno dei file nei sistemi Linux e macOS.

Differenze tra RegEx e le funzioni search o find

Potrebbe sembrare che le RegEx abbiano gli stessi effetti delle funzioni “search” e “find”.

In realtà si tratta di funzioni diverse.

Infatti, quando si cerca una stringa specifica, si utilizzano le funzioni “find” e “search”, ma se vogliamo sapere se esistono informazioni che corrispondono a un dato modello dobbiamo utilizzare le espressioni regolari (RegEx).

Peraltro, questi concetti sono noti - ad esempio - in Python ove esistono funzioni RegEx diverse tra loro e precisamente:

  • re.match()
  • re.search()
  • re.findall()

Questa non è la sede per approfondire tali argomenti molto tecnici.

Le RegEx possono essere utili in ambito giuridico?

Il tema delle RegEx sembra essere apparentemente di esclusiva competenza ed interesse di coloro i quali operano in ambito informatico.

Il nostro parere è diverso, nel senso che - essendo l’informatica oggi molto diffusa sia in ambito personale sia lavorativo - si dovrebbe prestare attenzione alla produttività per massimizzare i risultati dei nostri workflow. Detta così, sembra semplice. In realtà, pensiamo che ognuno di noi voglia ottenere i risultati migliori, sia in termini di tempo impiegato sia riguardo al risultato finale ottenuto, salvo che non si ritenga che si tratti di aspettative o obiettivi di utenti considerati “Pro”.

A nostro modesto parere, non si tratta di una classificazione tra utenti “Pro” e “basic” (o altra nomenclatura) ma di migliorare, con l’informatica, in termini generali l’efficienza di chi svolge determinate attività sia in campo personale sia lavorativo.

Ciò posto, anche in ambito “legal” sono importanti le RegEx per estrarre informazioni da un file, per trovare il testo che corrisponde a un dato modello (pattern) e opzionalmente sostituire quelle corrispondenze con nuovo testo.

Immaginiamo di dover effettuare attività su un testo medio-lungo per controllo di corrispondenza di certi dati, oppure per sostituirne alcuni; potremmo dover effettuare delle estrazioni da un file in formato CSV e così via.

Qualcuno potrebbe obiettare che questo tipo di attività sono realizzabili utilizzando semplicemente app come Microsoft Word o Excel.
Potrebbe essere così, ma a nostro avviso non si riuscirebbe a massimizzare il risultato e ottenere la precisione delle RegEx soprattutto quando la ricerca è focalizzata su un certo pattern.

Il vantaggio del testo semplice e del Markdown è indubbio.

Solo con file il cui contenuto è in testo semplice (plain text) o Markdown si raggiunge il massimo risultato nelle ricerche con RegEx. Infatti solo il testo semplice consente di essere utilizzato in altre app e di essere “trattato” con formattazioni; difficilmente può avvenire il contrario salvo che non si utilizzi un convertitore di formati come Pandoc e sempre che la conversione sia possibile.

In conclusione, riteniamo che le funzioni delle RegEx siano comunque valide ed utili anche in ambito giuridico-legale e le applicazioni sono molteplici e non semplicemente elencabili, anche perché ognuno potrebbe avere una finalità di utilizzo diversa da quella di altri.

Per chi si avvicina alle RegEx per la prima volta, suggeriamo di provare, magari anche con un editor potente che consenta di massimizzare i risultati.

A nostro avviso, la logica e la matematica non sono estranee al diritto e concorrono alla realizzazione degli obiettivi comuni.

Stay tuned!