Regular Expression (Parte I)

In questo tutorial andremo a scoprire le nuove espressioni regolari (in inglese regular expression) introdotte dal ASP.NET, spiegando di conseguenza come servirsene.

Innanzitutto, piccola parentesi su cosa sono le regular espression: si tratta di sintassi attraverso le quali si possono rappresentare insiemi di stringhe

Unire Acquisizioni Groups e Names:

Nelle versioni precedenti ai linguaggi .NET, era molto comune sfruttare ne notazione $1...$N come nell' esempio:

Dim userName As String = "Neimke, Darren"
Dim re As New RegEx( "(w+),s(w+)" )
userName = re.Replace( userName, "$2 $1" )
Response.Write( userName )

Con l' esempio sopra-riportato due parole separate da una virgola ed uno spazio contengono il nome ed il cognome di un user, formattandoli. Il risultato sarà la visualizzazione di "Darren Neimke" nella pagina.

Nel comando Replacementla notazione $N si riferisce al N gruppo di parentesi. Importante notare che in .NET l' elemenzo 0 ($0= si riferisce all' intero testo, e quindi a "Neimke, Darren" nell' esempio.

Ora però il .NET offre la classe Regex, che fornisce alcuni membri utili che permettono semplici richieste in-lined, riducendo la complessità e la prolessità del codice. I membri più utilizzati sono IsMatch, Match, Matches, Replace e Split. Sfruttandoli, ecco come apparirà il codice dell' esempio di sopra:

Dim userName As String = "Neimke, Darren"
userName = Regex.Replace( userName, "(w+),s(w+)" , "$2 $1" )

Ma i vantaggi non finiscono qui: usando il metodo IsMatch() ci si potrà assicurare che la stringa contenga una valore decimale, prima di eseguire il codice; ecco un esempio:

If Regex.IsMatch( userInputString, "d+(.?d+)" ) Then
    ' perform some conversion and math operations here
End If

Prima dei linguaggi .NET la regular expression Match conteneva alcuni SubMatches; questo non è cambiato nel .NET, se non per il fatto che ora si riferiscano ai Groups, collezioni di proprietà di un oggetto Match; ecco un esempio:

Dim userName As String = "Neimke, Darren"
Response.Write( Regex.Match( username, "(w+),s(w+)" ).Groups(2).ToString() )

Così verrà stampato sulla pagina "Darren" , in quanto membro di index = 2 del Group.

Nominare le Acquisizioni:

Inoltre, è possibile assegnare nomi ai Groups tramite le nuove sintassi (?<nameOfGroup>...) o (?'nameOfGroup'...). Assegnare un nome ad un groups aiuta a rendere il codice più compresibile; ecco un esempio:

Dim userName As String = "Neimke, Darren"
Dim pattern As String = "(?<surname>(w+)),s(?<firstname>(w+))"
Response.Write( Regex.Match( userName, pattern ).Groups("firstname").ToString() )

Il risultato? La pagina mostrerà la stringa "Darren".

Non-Acquisizioni

Nonostante le acquisizioni risultino estremamente potenti e versatili, possono provocare problemi di performance. Infatti, ad esempio, nelle espressioni regolari in VBScript o JScript c'è bisogno del' acquisizione ogni volta che vengono usate parentesi nelle regular expression; è possibile però che ci sia bisogno di usare le parentesi, senza però aver bisogno di un' acquisizione; ad esempio, se si vuole unire "Let's go this way" e "Let's go that way" , si userà la seguente regular expression:

Let's go th(is|at) way

dove le parentesi esprimono un ozione, una scelta. Sfortunatamente così si cade in un problema di performance, in quanto il testo catturato viene ricordato per mezzo di un backreference.

Fortunatamente le regular expression in .NET supportano la sintassi (?:...) , che permette di raggruppare senza incorrere in tali problemi di performance; ecco la sintassi corretta:

Let's go th(?:is|at) way


Continua a leggere la seconda parte dell'articolo >>



Ti potrebbe interessare anche

commenta la notizia

C'è 1 commento
Luca
Ti è piaciuto l'articolo?