fido.altervista.org

Espressioni Regolari - Metacaratteri - parte 2

Il metacarattere |

L'operatore logico "OR" viene reso nelle regex con il metacarattere |.
Dovendo per esempio trovare le occorrenze di casa o home, possiamo usare la regex casa|home.
Naturalmente, essendo questa una regex ancora un po' "grossolana", darà anche risultati di questo genere: casale, accasato, homes, homeless, ecc.

Un altro esempio.
Non ci ricordiamo bene se nel nostro elenco di indirizzi una certa Piazza si chiama "Eroi del 1945" o "Eroi del 1915".
Andiamo per gradi: per quanto abbiamo visto finora la regex può essere 1945|1915, così siamo sicuri che l'una o l'altra o tutt'e due saltano fuori.
Però, se notiamo che i due nomi possibili differiscono solo per quel 4 o quell'1, la regex può essere abbreviata così: 19(4|1)5.

NB: le parentesi tonde () sono necessarie per cogliere correttamente l'alternativa all'interno della regex. Se avessimo scritto 194|15 avremmo trovato 194 o 15.

Il metacarattere quantificatore ?

A volte non si è certi se un carattere esiste o no all'interno di una stringa, oppure si desiderano trovare determinate parole che contengano o no quel carattere.
A questo scopo esiste ? che, messo dopo un carattere, lo rende opzionale.
In pratica x? significa "nessuna volta o una volta il carattere x".

Se dal nostro indirizzario vogliamo ricavare sia i Rossi che i Rosi, osserviamo che una delle s è opzionale e quindi la regex da usare è Ross?i, o anche Ros?si.

Ricordiamo che ? si riferisce sempre solo al carattere immediatamente precedente.
Se vi sono più caratteri opzionali consecutivi li raggruppiamo con le parentesi tonde:

inter(nazionale)? trova sia inter sia internazionale;

(Mr)? Smith trova sia Mr Smith sia  Smith.

Stop! Svolgi gli esercizi del Gruppo 3

I metacaratteri quantificatori + e *

+ e * in un certo senso aumentano la portata di ?. Infatti:

+ trova le stringhe che contengono almeno una occorrenza del carattere precedente.
Ad esempio ah+ può trovare le esclamazioni ah, ahh, ahhh,... ma non trova a.

* trova le stringhe che contengono quante si vuole (anche zero) occorrenze del carattere precedente. Quindi in questo caso:
ah* può trovare ah, ahh, ahhh,... e anche a.

NB: Il metacarattere + di per sé non sarebbe indispensabile, infatti:
(qualcosa)+ è equivalente a (qualcosa)(qualcosa)* ;
ma come si vede è una utile scorciatoia.

Vediamo un altro esempio.
Dobbiamo fare in modo che un utente possa inserire solo numeri, ma non un numero che inizi per zero. La regex ^[1-9][0-9]*$ serve allo scopo: i metacaratteri ^ e $ di inizio e fine linea fanno sì che l'input dell'utente possa contenere solo quanto indicato all'interno, ^[1-9] indica che all'inizio i caratteri ammessi sono quelli che vanno da 1 a 9, quindi lo zero è escluso; [0-9]* infine indica che poi sono ammesse quante ripetizioni si vogliono (anche nessuna) dei caratteri che vanno da 0 a 9.

NB: La combinazione .* forma una semplice regex per trovare un'intera linea di testo. Fate attenzione però perché questo vale solo nelle applicazioni in cui il metacarattere . trova qualunque carattere eccetto quello di nuova linea; nelle altre applicazioni .* troverà tutto il testo dall'inizio alla fine.

Il metacarattere quantificatore { }

Se sappiamo per certo di voler trovare ahhhhhhhh con otto h, possiamo più brevemente scrivere la regex così: ah{8}.
Volendo invece trovare le esclamazioni che hanno da due a sei h scriviamo:
ah{2,6}.

{min,max} viene chiamato quantificatore di intervallo e permette di raffinare la funzione del metacarattere *, indicando il numero minimo e massimo di occorrenze.
Come abbiamo visto, se n=min=max si può scrivere {n}. Se min è noto e max è indeterminato, si può scrivere {min,}.

Da quanto si è detto dovrebbe risultare chiaro che:
{0,1} è equivalente a ?
{0,} è equivalente a *
{1,} è equivalente a +

NB: Il primo numero dell'intervallo va sempre specificato.
Quindi {min,} va bene, mentre {,max} non va bene.
Infine, se non sono usate in queste forme previste, le parentesi graffe tornano al loro significato letterale.

Il metacarattere { } non è supportato da tutte le applicazioni: ad esempio Crimson Editor e NoteTab Light non riconoscono le parentesi graffe come metacaratteri.
Il newsreader Dialog invece è in grado di gestire filtri che contengono { }.

I metacaratteri quantificatori sono greedy

I quantificatori nelle regex vengono detti greedy, cioè avidi, perché trovano il massimo che riescono a trovare. Chiariamo con un esempio:
La donzelletta vien dalla campagna
Volendo trovare stringhe che iniziano con "am" e finiscono con "a" usiamo la regex am.*a. Ecco il risultato:
La donzelletta vien dalla campagna
La regex ha trovato tutto ciò che era possibile: avrebbe potuto fermarsi a campagna, invece è andata avanti, ha trovato un'altra occorrenza di "a", e ha compreso tutto nel suo risultato.
Se non è questo quello che vogliamo, dobbiamo esserne consapevoli e agire di conseguenza. In questo esempio una soluzione potrebbe essere quella di non accettare altre "a": am[^a]*a , ma più avanti (in approfondimenti) vedremo come i quantificatori possono essere resi non-greedy.

Stop! Svolgi gli esercizi del Gruppo 4

torna su home avanti

Valid XHTML 1.0! indirizzo gmail Valid CSS 2!

© MLC 2003-2004