Formattazione e validazione con ASP.NET

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 Function

Se 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

2 pagine in totale: <<Indietro 1 [2]

Contenuti dell'articolo

Commenti
Dai un voto a questo articolo, ci aiuterà a migliorare il nostro sito (1 è il voto minimo, 5 il massimo).

Per procedere al rating dell'articolo devi essere autenticato.

TUTORIALS
TOP TEN ARTICOLI
NOTIFICHE

Iscriviti alla nostra newsletter nuoviarticoli per ricevere e-mail le notifiche!

Indirizzo e-mail:
PROVIDER ASP.NET 2.0

Seleziona il database per avere il web.config pronto per Membership, Roles e Profile API.



IN EVIDENZA
MISC