Quando si ha a che fare con la manipolazione di stringhe, ad esempio per estrarre specifiche informazioni partendo dalla conoscenza di una particolare struttura della stringa stessa, non si può fare a meno dell'uso delle espressioni regolari. Non a caso, la stragrande maggioranza dei linguaggi di programmazione spesso le supporta nativamente. E JavaScript non fa eccezione (ne abbiamo parlato in questa lezione).
Tuttavia, quando ci si approccia all'uso di questo potentissimo strumento, il primo impatto è spesso piuttosto pesante, quasi criptico, per via del particolare vocabolario che è necessario conoscere per comporre le espressioni regolari. Non è raro che anche sviluppatori con una certa esperienza alle spalle talvolta facciano fatica a "decifrare" un'espressione regolare scritta qualche mese prima! E questo problema è ancora più evidente se si pensa a chi ha la necessità di dover revisionare codice scritto da altri.
Con questa criticità in mente, il programmatore Francis Strokes ha pensato di sviluppatore una libreria JavaScript, denominata Super Expressive, per semplificare la creazione di espressioni regolari partendo da un insieme di metodi che rendono l'intero processo molto più comprensibile, e quindi manutenibile.
Super Expressive non ha nessuna dipendenza, e può risultare utile in molti contesti.
Installare ed utilizzare Super Expressive
Il codice sorgente di Super Expressive è liberamente accessibile su GitHub. Possiamo installarlo sfruttando npm:
npm i super-expressive
Una volta installato, può essere integrato all'interno del nostro progetto come di consueto:
const SuperExpressive = require('super-expressive');
Alternativamente, possiamo integrarlo come modulo ES6:
import SuperExpressive from 'super-expressive';
Creare espressioni regolari con Super Expressive
Per utilizzare Super Expressive all'interno dei nostri script, dovremo innanzitutto creare un'istanza dell'oggetto SuperExpressive
. Dopodiché, sarà sufficiente usare una serie di metodi, ognuno dei quali consentirà di specificare un particolare pattern.
Vediamo subito un esempio, tratto dalla documentazione (disponibile sul già citato repository di GitHub):
const SuperExpressive = require('super-expressive');
const myRegex = SuperExpressive()
.startOfInput
.optional.string('0x')
.capture
.exactly(4).anyOf
.range('A', 'F')
.range('a', 'f')
.range('0', '9')
.end()
.end()
.endOfInput
.toRegex();
È abbastanza intuitivo comprendere cosa farà questa catena di metodi. Il primo, startOfInput
, permette di specificare che l'espressione regolare deve considerare le sole sottostringhe che si trovano all'inizio della stringa oggetto di analisi. A seguire, optional.string('0x')
permette di specificare che, opzionalmente, deve essere considerata anche la stringa '0x'. Il metodo capture
, in combinazione exactly
, consente di esprimere la necessità di riconoscere esattamente 4 caratteri, compresi nei range di lettere e numeri specificati dall'omonimo metodo.
Infine, toRegex()
converte il tutto in una espressione regolare vera o propria, che nel caso specifico è la seguente:
/^(?:0x)?([A-Fa-f0-9]{4})$/
Conclusioni
Quello appena visto è solo un esempio, ma può facilmente essere generalizzato facendo riferimento alla summenzionata documentazione, unitamente a qualche test.
Super Expressive rappresenta una interessante opportunità, soprattutto per migliorare la leggibilità e manutenibilità del codice, e che può trovare applicazioni molto fruttuose in team che applicano costantemente il processo della code review, richiedendo a più membri del team di rivedere il codice di altri.