Espressioni regolari: la “magia oscura” del parsing.
Suona piuttosto affascinante, vero?
In realtà, a volte sembrano meno una forma di magia oscura e più un incantesimo misterioso che funziona perfettamente, finché una stringa molto specifica non manda tutto in confusione.
Va bene, forse sto esagerando un po’. Lascia però che ti racconti come sono arrivato a questa conclusione.
L'inizio
Come forse già sai, sono il creatore di StyleZero.
StyleZero dispone di un proprio parser, inizialmente sviluppato con una logica di matching personalizzata, senza utilizzare espressioni regolari.
A un certo punto, ho letto su Facebook il consiglio di uno sviluppatore esperto, secondo il quale le regex gli avevano fatto risparmiare molte ore di lavoro.
Naturalmente, ho pensato:
Perché no? Vediamo come va.
L'implementazione
Scrivere un’unica, enorme espressione regolare per l’intero parser di StyleZero non sarebbe stata una grande idea, quindi ho suddiviso la logica in diverse variabili.
Il risultato finale non era esattamente semplice da leggere, ma funzionava.
Per farla breve, sono riuscito a raccogliere in una sola funzione una logica che prima era distribuita in diversi file.
Sembrava fantastico.
Tutto funzionava alla perfezione, finché, a un certo punto, ha smesso di farlo.
Un grande classico.
Che cosa è successo?
Un collega diventato un grande appassionato di StyleZero aveva notato che alcuni SVG impedivano al compiler di completare il proprio lavoro.
Non era una situazione disastrosa, perché aveva già trovato un workaround. Tuttavia, dopo aver riprodotto lo stesso problema in altri casi, volevo capire che cosa lo causasse realmente.
Dopo diversi test e dopo aver rimosso con attenzione varie parti del template, ho scoperto che StyleZero presentava un errore quando incontrava una stringa alfanumerica lunga tra 13 e 16 caratteri.
All’inizio, la cosa mi è sembrata piuttosto divertente.
Da un lato, il parser riusciva a elaborare template enormi senza alcuna difficoltà. Dall’altro, bastava un piccolo file contenente qualcosa del genere per bloccarlo:
234n905ct395945
Dopo alcune verifiche, ho confermato che il problema era causato dalle espressioni regolari.
Ho quindi trascorso tre o quattro giornate piuttosto intense a riscrivere il parser da zero, così da poter pubblicare la versione 9.2.1.
Alla fine, il problema si è trasformato in una buona opportunità di miglioramento. Il nuovo parser è nettamente migliore del precedente, sia dal punto di vista della struttura sia per quanto riguarda il funzionamento.
Il mio consiglio
Le espressioni regolari sono strumenti potenti, quindi usale pure, ma con attenzione.
Sono ottime per attività di ricerca e corrispondenza semplici e ben definite. Quando però la logica diventa molto estesa, complessa e difficile da spiegare, una soluzione più facile da mantenere può evitarti qualche interessante sorpresa in futuro.