Continuiamo la serie di articoli sulle espressioni regolari, iniziata con il post sul punto e sui gruppi, parlando degli operatori.
Gli operatori (il più, l’asterisco e le parentesi graffe) servono per considerare valori multipli del valore che seguono. In parole povere ci permettono di dire al Regex Tool di Alteryx quanti elementi andare a cercare.
Il più (+) significa 1 o più occorrenze
STRINGA | ESPRESSIONE | RISULTATO |
---|---|---|
Coma | (Com+a) | Coma |
Comma | (Com+a) | Comma |
Commilitone | (Com+a) | – |
Coa | (Com+a) | – |
Vogliamo andare a studiare la lettera che precede il più, la lettera “m”. Vogliamo tutte le parole che iniziano per “Co”, poi hanno una o più “m” e poi una “a”.
La nostra espressione regolare sarà in grado di trovare “Coma” e “Comma”, che soddisfano l’espressione, ma non sarà un grado di trovare “Commilitone”, perché dopo la sequenza di “m” non c’è la vocale “a” e neppure “Coa” perché non contiene la lettera “m”.
L’asterisco (*) significa 0 o più occorrenze
STRINGA | ESPRESSIONE | RISULTATO |
---|---|---|
Coma | (Com*a) | Coma |
Comma | (Com*a) | Comma |
Commilitone | (Com*a) | – |
Coa | (Com*a) | Coa |
Vogliamo tutte le parole che iniziano per “Co”, poi hanno da 0 a più “m” e poi una “a”. Non è strettamente neccessario che la “m” ci sia.
La nostra espressione regolare sarà in grado di trovare “Coma” e “Comma” e, questa volta, anche “Coa”. Non sarà in grado di trovare “Commilitone”, perché dopo la sequenza di “m” non c’è la vocale “a”, però è in grado di trovare “Coa” perché l’asterisco contempla anche la non presenza della lettera “m”.
A cosa serve la possibilità di considerare anche 0 occorrenze? Non so, supponiamo di voler contare all’interno di un testo quante volte è usato il pronome/aggettivo “QUALE”.
In italiano lo concordiamo in base al numero (singolare e plurale), quindi dovremo cercare la parola “qual” seguita da una vocale: qual[aeiou] che ci restituirà sia “quale” che “quali”.
E cosa mi dite di “qual”?? Versione contratta di “quale è”, spesso scritto “qual è”?
La vocale finale è troncata, però si tratta comunque della parola che stiamo studiando, sarebbe più corretto tenere conto anche di questa versione. E l’asterisco ci viene in aiuto.
Cambiando l’espressione regolare in qual[aeiou]* andiamo a cercare la parola “qual” seguita da niente o da una vocale.
Il punto di domanda (?) significa 0 o 1 occorrenza
STRINGA | ESPRESSIONE | RISULTATO |
---|---|---|
Coma | (Com?a) | Coma |
Comma | (Com?a) | – |
Commilitone | (Com?a) | – |
Coa | (Com?a) | Coa |
Vogliamo tutte le parole che iniziano per “Co”, poi hanno 1 “m” o non ce l’hanno proprio, e poi una “a”. Non vengono trovate le parole che hanno più di una “m”, da 2 in su.
Le parentesi graffe {} permettono di specificare quante volte l’occorenza si deve ripetere
STRINGA | ESPRESSIONE | RISULTATO |
---|---|---|
Aiuola | (w{4}) | Aiuo |
Coeli | (w{4}) | Coel |
Pollo | ([aeiou]{2,3}) | – |
Pastiglia | ([aeiou]{2,3}) | ia |
Nelle prime due righe stiamo andando a cercare una sequenza di 4 lettere.
Nelle ultime due righe stiamo andando a cercare una sequenza di vocali, da un minimo di 2 a un massimo di 3.
Le parentesi graffe, se contengono un valore unico, servono per specificare il numero esatto di quello che seguono.
Se contengono due numeri separati da virgola {min, MAX}, servono per specificare il numero minimo e massimo di ripetizioni. Se si lascia vuoto il MAX, significa “infinito”.
Quindi:
{0,} (che si ripete 0 o più volte) corrisponde all’asterisco *
{1,} (che si ripete 1 o più volte) corrisponde al +
{0,1} (che si ripete 0 oppure 1 volta) corrisponde al punto di domanda ?
{1} (che si ripete 1 volta) corrisponde a non mettere niente.
Come avete visto nelle ultime due righe della tabella dell’ultimo esempio, gli operatori si possono applicare anche ai gruppi tra parentesi quadre.
Sarà quindi possibile andare a cercare una sequenza di lettere e/o spazi –> ([w|s]*)
E ora passiamo alla solita simulazione di una situazione reale in cui applicare quello che abbiamo imparato oggi. Facciamo finta di voler controllare degli indirizzi email, per capire quali siano veri e quali fasulli, concentrandoci solo sul dominio.
Sappiamo che il dominio di un indirizzo email finisce con “.qualcosa”: .com, .it, .de, .fr, .info, .co.uk, ecc, ecc, ecc… Noi vogliamo controllare quello che c’è dopo il punto.
Abbiamo due elementi: il punto (W) e quello che viene dopo il punto, che sappiamo poter essere (per semplificare l’esempio) una sigla di 2, 3 o 4 lettere minuscole, che non contiene numeri ([a-z]{2,4}).
Quindi la nostra espressione regolare sarà: (W[a-z]{2,4})
Qual è il problema? Se inseriamo questa regex col metodo Match, ci verrà individuato come falso un indirizzo email inglese (.co.uk).
Come possiamo fare per dire al regex che quel “.qualcosa”, che dopo il punto abbia solo da 2 a 4 lettere minuscole, può ripetersi per un massimo di 2 volte?