Breve panoramica sulle espressioni regolari
Agosto 15, 2008
La necessità di processare del testo è una tra le più ricorrenti tra le attività che ogni giorno svolgono gli sviluppatori: controllo dell’input utente, sostituzione di caratteri speciali, ecc. Per molti anni gli sviluppatori UNIX e Perl hanno avuto a disposizione un complesso, ma molto efficace, strumento: le Espressioni regolari.
Il linguaggio delle espressioni regolari è progettato e ottimizzato per la ricerca e la modifica del testo. Il linguaggio utilizza due tipi fondamentali di caratteri: caratteri effettivi e metacaratteri (più semplicemente, caratteri jolly). La capacità elaborativa delle espressioni regolari deriva dal set di metacaratteri.
Senza approfondire le tecniche più avanzate, come il Backreference, facciamo una panoramica generale di questo linguaggio di text-matching e di come è possibile utilizzarlo con profitto nelle nostre applicazioni.
L’uso più semplice di una espressione regolare è la verifica di una stringa con un pattern. Ad esempio, l’espressione regolare “nane” verifica con successo le stringhe “banane”, “nanerottola” e “xyznanexyz”, in quanto ognuna di queste stringhe contiene il pattern dell’espressione regolare; nessun carattere speciale è richiesto per un compito simile.
Se volessimo invece verificare che un pattern ricorra dal primo carattere di una determinata stringa dovremmo far precedere il nostro pattern dal carattere speciale “^”. Tornando all’esempio precedente, l’espressione regolare “^nane” verificherà con successo la stringhe “nanerottola” e “xyznanexyz”, ma non “banane”. Diversamente, se dovessimo verificare che il pattern ricorresse al termine della stringa, dovremmo utilizzare il carattere speciale “$”, così l’ espressione regolare “nane$” verificherà “banane”, ma non “nanerottola” e “xyznanexyz”, mentre l’espressione regolare “^nane$” verificherà solamente la stringa “nane” e nessun altra.
| ^ | Specifica che il pattern deve ricorrere esattamente all’inizio della stringa analizzata. |
| $ | Specifica che il pattern deve ricorrere esattamente alla fine della stringa analizzata. |
| \A | Specifica che il pattern deve ricorrere esattamente al primo carattere della stringa analizzata, e ignorare le righe multiple. |
| \Z | Specifica che il pattern deve ricorrere esattamente alla fine dell’ultimo carattere della stringa analizzata, e ignorare le righe multiple. |
| \G | Indica che il pattern deve ricorrere nel punto dove è terminato il pattern precedente. |
| \b | Indica che il pattern deve ricorrere tra caratteri alfanumerici(\w), o non alfanumerici(\W) |
| \B | Indica che il pattern non deve ricorrere tra caratteri alfanumerici(\w), o non alfanumerici(\W) |
Notare che il linguaggio delle espressioni regolari è case-sensitive e spesso metacaratteri maiuscoli hanno significato opposto ai metacaratteri minuscoli. Inoltre è interessante notare che molti metacaratteri iniziano con il carattere “\”, chi sviluppa in C# dovrebbe ricordare di precedere ogni stringa che rappresenta un’espressione regolare con il carattere “@”, ad esempio:
Regex.IsMatch("pattern",@"\Apattern\Z");
Le espressioni regolari trovano particolare utilità anche per la verifica dei caratteri speciali, i quali non saranno ricercati in un semplice file di testo, tuttavia nella verifica di output generato da codice legacy o sistemi UNIX è un caso molto comune.
| \a | Specifica un carattere bell(allarme) \u0007. |
| \t | Specifica un carattere tab(tabulazione) \u0009. |
| \r | Specifica un carattere carriage return(ritorno a capo) \u000D. |
| \v | Specifica un carattere vertical tab(tabulazione verticale) \u000B. |
| \f | Specifica un carattere form feed(torna a inizio riga) \u000C. |
| \n | Specifica un carattere new line(nuova linea) \u0009. |
| \e | Specifica un carattere escape(annulla) \u001B. |
| 40 | Specifica un carattere ASCII in formato ottale di 3 cifre, ad esempio 40 rappresenta uno spazio. |
| \cC | Specifica un carattere ASCII di controllo, ad esempio \cC rappresenta control-C. |
| \x20 | Specifica un carattere ASCII in formato esadecimale di 2 cifre. |
| \ | Quando precede un metacarattere, indica al processore di ignorare la sequenza di escape, ad esempio \* indica esattamente l’asterisco, \\ indica il backslash. |
Le espressioni regolari trovano però la loro versatilità nella verifica di pattern più complessi, come i caratteri ripetuti o opzionali, ad esempio il simbolo “*” preceduto da un carattere indica 0 o più volte quel carattere, “+” indica invece 1 o più caratteri, per specificare un preciso numero di ripetizioni di un determinato carattere viene utilizzato un blocco “{n}”, dove n è il numero preciso di caratteri da ripetere. Allo stesso modo è possibile stabilire un range di valori per la ripetizione del carattere con il blocco “{n,m}”, dove n è il numero minimo, e m il massimo. Per includere un carattere opzionale si utilizza il simbolo “?”, per ogni singolo carattere il simbolo “.”. Per includere più caratteri vengono utilizzati dei blocchi “[xyz]“, dove “xyz” sono i caratteri opzionali, sempre nei blocchi di parentesi quadre si possono specificare anche range di set di caratteri, ad esempio “[a-n]“, indica che sono consentiti i caratteri dalla “a” alla “n”. Per specificare caratteri alternativi viene utilizzato il simbolo “|” ad esempio la sequenza “(a|ba)nane” indica o “anane” oppure “banane” indifferentemente.
| \d | Indica una cifra. E’ equivalente alla sequenza [0-9]. |
| \D | Indica un carattere non cifra. E’ equivalente alla sequenza [^0-9]. |
| \s | Indica un qualsiasi carattere di spazio, inclusi tabulazioni e form-feed. E’ equivalente alla sequenza [\f\n\r\t\v]. |
| \S | Nega il precedente. |
| \w | Indica un qualsiasi carattere letterale, incluso underscore. E’ equivalente alla sequenza [A-Za-z0-9_]. |
| \W | Nega il precedente. |
Naturalmente l’utilizzo delle espressioni regolari non si limita al crudo matching delle stringhe, e questo articolo non è riuscito neppure a grattare la superficie di un argomento tanto vasto, numerosissimi testi sono stati scritti in proposito. Ho scritto questa breve panoramica in quanto mi sto preparando all’esame 70-536 e il fatto di aver sempre snobbato le Regular Expression mi fa capire quanto spesso ci ostiniamo a evitare la soluzione più semplice, quando la soluzione ottimale c’è e richiede solo il necessario sforzo per essere padroneggiata. Siccome le sequanze di escape sono molte e la mia memoria è terribile o scritto questo semplicissimo tool che potrebbe essere utile per esercitarsi nella costruzione delle espressioni regolari più semplici.
Entry Filed under: aspnet, programmazione. Tag: c#, espressioni regolari, programmazione, text matching.
1 Comment Add your own
Leave a Comment
Some HTML allowed:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>
Trackback this post | Subscribe to the comments via RSS Feed

1.
vittOS | Agosto 21, 2008 at 7:19 am
Ciao Maestro, si impara sempre da te, 6 grande! Ciao