2 pagine in totale: <<Indietro 1 [2]
Le regular expressions
Le regular expressions (dette anche, in forma contratta, regex) rappresentano un formidabile metodo di verifica e di individuazione di stringhe che si basa sostanzialmente sulla ricerca di corrispondenze di testo (pattern matching). Le regex rappresentano una tecnica che permette di capire se una stringa di caratteri verifica o meno determinate caratteristiche utilizzando una maschera descrittiva, detta pattern.
Tramite le regular expressions è pertanto possibile verificare la validità di una stringa di caratteri (convalida dei dati) oppure manipolare con estrazioni e/o sostituzioni il testo di input, il tutto sempre in funzione del pattern.
Le regular expressions seguono regole sintattiche ben precise, dato che rappresentano un criterio di testo costituito da caratteri ordinari, ad esempio le lettere dalla "a" alla "z" oppure i numeri, e da caratteri speciali, denominati metacaratteri. Il criterio descrive una o più stringhe di cui deve essere trovata una corrispondenza durante la ricerca all'interno del testo di input.
Nella tabella seguente sono riportate le principali regole per interpretare le regular expressions.
| () | Permettono di racchiudere le diverse parti dell'espressione. |
| \ | Carattere di escape. Contrassegna il carattere successivo come carattere speciale: per esempio "\n" corrisponde a un carattere di nuova riga, "\\" corrisponde a "\" e "\(" a "(". |
| ^ | Corrisponde alla posizione all'inizio della stringa di input. |
| $ | Corrisponde alla posizione alla fine della stringa di input. |
| * | Trova zero o più corrispondenze con la sottoespressione o il carattere precedente. |
| + | Trova una o più corrispondenze con la sottoespressione o il carattere precedente. |
| ? | Trova zero o una corrispondenza con la sottoespressione o il carattere precedente. |
| {n} | Trova esattamente n corrispondenze (n => intero non negativo). |
| {n,} | Trova almeno n corrispondenze (n => intero non negativo). |
| {n,m} | Trova almeno n e al massimo m corrispondenze (m>= n - n e m => interi non negativi). |
| ? | Indica che il criterio di ricerca è specifico (non greedy). Un criterio specifico trova il minor numero possibile di corrispondenze con la stringa con cui viene eseguita la ricerca, mentre il criterio generico predefinito trova il maggior numero possibile di corrispondenze con tale stringa. |
| . | Corrisponde a qualsiasi carattere singolo tranne "\n". |
| x|y | | è l'operatore OR. Corrisponde a x o y. |
| [xyz] | Set di caratteri. Corrisponde a qualsiasi carattere incluso. |
| [^xyz] | Set di caratteri negativo. Corrisponde a qualsiasi carattere non incluso. |
| [a-z] | Intervallo di caratteri. Corrisponde a qualsiasi carattere compreso nell'intervallo specificato. |
| [^a-z] | Intervallo di caratteri negativo. Corrisponde a qualsiasi carattere non compreso nell'intervallo specificato. |
| \b | Corrisponde a un inizio o a una fine di parola, ovvero alla posizione tra una parola e uno spazio. |
| \B | Corrisponde a caratteri che non costituiscono un inizio o una fine di parola. |
| \cx | Corrisponde a un carattere di controllo indicato da x. |
| \d | Corrisponde a una cifra. Equivale a [0-9]. |
| \D | Corrisponde a un carattere diverso da una cifra. Equivale a [^0-9]. |
| \f | Corrisponde a un carattere di avanzamento modulo. Equivale a \x0c e \cL. |
| \n | Corrisponde a un carattere di nuova riga. Equivale a \x0a e \cJ. |
| \r | Corrisponde a un carattere di ritorno a capo. Equivale a \x0d e \cM. |
| \s | Corrisponde a qualsiasi carattere di spazio vuoto, come spazio, tabulazione, avanzamento modulo e così via. Equivale a [ \f\n\r\t\v]. |
| \S | Corrisponde a qualsiasi carattere diverso da uno spazio vuoto. Equivale a [^ \f\n\r\t\v]. |
| \t | Corrisponde a un carattere di tabulazione. Equivale a \x09 e \cI. |
| \v | Corrisponde a un carattere di tabulazione verticale. Equivale a \x0b e \cK. |
| \w | Corrisponde a qualsiasi carattere alfanumerico, incluso il carattere di sottolineatura. Equivale a "[A-Za-z0-9_]". |
| \W | Corrisponde a qualsiasi carattere non alfanumerico. Equivale a "[^A-Za-z0-9_]". |
| \xn | Corrisponde a n, dove n rappresenta un valore di escape esadecimale. Consente l'uso dei codici ASCII nell'ambito delle regular expressions. |
| \un | Corrisponde a n, dove n è un carattere Unicode espresso in quattro cifre esadecimali. |
Alcuni esempi:
Pattern per indirizzi e-mail:
(\w[-._\w]*\w@\w[-._\w]*\w\.\w{2,3})
Pattern per numeri telefonici:
^[+][0-9]\d{2}-\d{3}-\d{4}$
Pattern per indirizzi IP:
^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.
(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$La classe Regex
Regex è la la classe più importante tra quelle contenute nel namespace System.Text.RegularExpressions, dato che qualsiasi funzionalità che utilizzi le regular expressions deve in ogni caso prevedere di usare tale classe. La classe Regex contiene infatti numerosi metodi statici che consentono di utilizzare un'espressione regolare senza creare in modo esplicito un oggetto Regex.
Utilizzare un metodo statico equivale a costruire un oggetto Regex, utilizzandolo una sola volta e quindi distruggendolo. La classe Regex è immutabile, ovvero è di sola lettura, ed è per definizione thread-safe. Gli oggetti Regex possono essere creati in qualsiasi thread e condivisi tra thread.
I tre metodi principali della classe sono Matches, Match e Replace. Il primo metodo permette di validare una stringa di input, cercando tutte le ricorrenze da un'espressione regolare e restituendo tutte le corrispondenze corrette. Si noti che il metodo Matches è analogo al metodo Match (che non fa altro che ricercare una singola corrispondenza di un'espressione regolare nell'ambito della stringa di input), se non per il fatto che Matches restituisce l'elenco completo delle corrispondenze corrette che risulterebbero dalla chiamata iterativa del metodo Match. L'insieme dei risultati include solo le corrispondenze corrette e termina alla prima mancata corrispondenza.
L'altro metodo di una certa importanza è Replace, che sostituisce tutte le ricorrenze di un criterio di caratteri definito da un'espressione regolare con una stringa di caratteri di sostituzione specificata.
Un esempio pratico: RegularExpressionValidator
Tra i vari tipi di controllo Web di ASP.NET esistono i validatori, che permettono di verificare e validare i dati immessi dagli utenti. Il RegularExpressionValidator appartiene a questa categoria di controlli e permette di accettare un dato in ingresso se questo risulta essere compatibile con una determinata espressione regolare.
Infatti una delle proprietà del controllo è ValidationExpression di tipo String, che permette di definire il pattern di validazione composto da caratteri ordinari e metacaratteri in base alle regole sintattiche viste in precedenza. Tra i metodi del controllo è presente inoltre la funzione EvaluateIsValid(), che viene invocata durante la validazione e, come si può vedere investigando tramite reflection, fa uso del metodo Regex.Match().
Protected Overrides Function EvaluateIsValid() As Boolean
Dim flag1 As Boolean
Dim text1 As String = MyBase.GetControlValidationValue(MyBase.ControlToValidate)
If ((text1 Is Nothing) OrElse (text1.Trim.Length = 0)) Then
Return True
End If
Try
Dim match1 As Match = Regex.Match(text1, Me.ValidationExpression)
flag1 = ((match1.Success AndAlso (match1.Index = 0)) AndAlso (match1.Length = text1.Length))
Catch obj1 As Object
flag1 = True
End Try
Return flag1
End FunctionSe la proprietà del controllo EnableClientScript è impostata a True, la convalida viene eseguita anche sul client. La sintassi di convalida dell'espressione sul client si differenzia leggermente da quella sul server. Sul client infatti viene utilizzata la sintassi dell'espressione regolare JScript, mentre in ambito server viene utilizzata la funzione appena vista (e la sintassi Regex).
Poiché la sintassi dell'espressione regolare JScript è un sottoinsieme della sintassi Regex, è consigliabile utilizzare tale sintassi per ottenere gli stessi risultati sia sul client che sul server. In ogni caso le regole sintattiche riportate in precedenza hanno validità generale.
Conclusioni
Per realizzare applicazioni sicure e robuste occorre gestire in maniera opportuna i dati che vengono trattati. I meccanismi di formattazione e validazione visti in questo articolo, insieme ai controlli Web di ASP.NET, forniscono un valido supporto e utili strumenti per gestire al meglio il flusso delle informazioni, da e all'utente finale.
E' un errore sottovalutare l'importanza che rivestono il controllo e la rappresentazione dei dati, soprattutto nell'ambito delle applicazioni Web, dove l'estetica, oltre che la funzionalità, assume un ruolo spesso decisivo.
Approfondimenti
- Classe String
- Metodo String.Format
- Controllo DataGrid
- Classe Regex
- Controllo RegularExpressionValidator
- RegExLib.com
- Download: The Regulator
2 pagine in totale: <<Indietro 1 [2]
Contenuti dell'articolo
Per inserire un commento, devi registrarti alla nostra community.







Difficoltà
Utilità

Stampa
Download 


