Trovare una data in un testo con le Espressioni Regolari

Trovare una data in un testo sarebbe un compito piuttosto facile con qualsiasi editor di testo, se non fosse per il fatto che una data, almeno in italiano, può essere scritta in molti modi diversi.

Per esempio il 05/04/2017 può essere scritto: 5/4/2017, 05/04/2017, 5/04/2017, 5.5.2017, 05-4-2017, 5 aprile 2017, 05 apr '17, aprile 2017, solo per fare alcuni esempi.

Come fare allora, se non ne conosciamo il formato esatto, a trovare una data in un testo?

trovare una data in un testo con le RegExFortunatamente ci vengono in soccorso le Espressioni Regolari (ne abbiamo già parlato in un precedente articolo), un linguaggio utilizzabile nella maggior parte degli editor di testo (il migliore fra i gratuiti è senz’altro Notepad++).

Ed ecco, senza troppi giri di parole, l’espressione regolare che riesce ad individuare qualsiasi tipo di data in un testo.

Fate la prova: scaricate Notepad++ dal link qui sopra, incollateci il testo di questa pagina, aprite il modulo di ricerca cliccando sul binocolo nella barra in alto oppure digitando CTRL+F incollate l’intera espressione regolare nella casella di testo “Trova” e biffate in basso a sinistra la casella “Espressione regolare”.

Ora cliccate in alto a destra su “Trova successivo” e vedrete che le date saranno evidenziate una ad una ogni click che fate.

(\d\d?)?(\s|/|-|\.)?(\d|\d\d|gen(naio)?|feb(braio)?|mar(zo)?|apr(ile)?|mag(gio)?|giu(gno)?|lug(lio)?|ago(sto)?|set(tembre)?|ott(obre)?|nov(embre)?|dic(embre)?)?(\s|/|-|\.)?(\d\d\d\d|'\d\d)

La RegEx in dettaglio

Esaminando l’espressione regolare qui sopra, vediamo che è composta da 5 gruppi, ognuno racchiuso da una coppia di parentesi tonde.

Il primo gruppo rappresenta il giorno della data ed è composto da due \d che significa “una cifra qualsiasi”; notate che la seconda \dè seguita da un punto interrogativo che significa che il carattere subito precedente può esserci o non esserci.

Quindi il primo gruppo individua una o due cifre ma, poiché è anche possibile che la data sia scritta senza giorno (per esempio aprile 2017) il punto interrogativo subito fuori la parentesi di chiusura avvisa che l’intero gruppo può anche non esserci.

Il secondo gruppo rappresenta i possibili separatori di data: nel nostro caso abbiamo previsto come separatori lo spazio (\s), la slash (/), il trattino alto (-), il punto (\.). Notate come ogni carattere è separato dal simbolo | che, nelle espressioni regolari, ha la funzione di un OR logico.

Notate anche che il punto è preceduto da una backslash (\) che rappresenta un carattere di “escape” e che ci dice che quel punto non è il carattere jolly delle RegEx che rappresenta “qualsiasi carattere”, ma è proprio il simbolo del punto.

Anche il secondo gruppo può anche non esserci e quindi è seguito da un ? .

Il terzo gruppo rappresenta i nomi dei mesi. Tutte le possibili varianti sono separate dal carattere | e quindi sono ugualmente possibili.

Per tenere conto anche del fatto che i mesi possono essere abbreviati dalle tre lettere iniziali, il rimanente del nome del mese è raggruppato fra parentesi e seguito da un punto interrogativo.

Così, gen(naio)?significa che deve essere ricercato sia gen che gennaio.

Anche l’intero terzo gruppo è seguito da un punto interrogativo per cercare perfino le date in cui compare solamente l’anno.

Il quarto gruppo è uguale al secondo e rappresenta il separatore di data, mentre il quinto gruppo rappresenta l’anno che può essere scritto con 4 cifre (\d\d\d\d) oppure con 2 cifre precedute da un apostrofo ('\d\d).

I cinque gruppi che abbiamo esaminato formano quindi una Espressione regolare che ci permette di trovare una data in un testo in qualsiasi formato sia scritta: anche se contiene solamente l’anno!

 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *