Regular Expression (Parte I)

In questo tutorial andremo a scoprire le nuove espressioniregolari (in inglese regular expression) introdotte dalASP.NET, spiegando di conseguenza come servirsene.

Innanzitutto, piccola parentesi su cosa sono le regularespression: si tratta di sintassi attraverso le quali sipossono rappresentare insiemi di stringhe

Unire Acquisizioni Groups e Names:

Nelle versioni precedenti ai linguaggi .NET, era molto comunesfruttare 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 unavirgola ed uno spazio contengono il nome ed il cognome di unuser, formattandoli. Il risultato sarà lavisualizzazione di "Darren Neimke" nella pagina.

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

Ora però il .NET offre la classe Regex, che forniscealcuni membri utili che permettono semplici richiestein-lined, riducendo la complessità e laprolessità del codice. I membri più utilizzatisono IsMatch, Match, Matches, Replace e Split. Sfruttandoli,ecco come apparirà il codice dell' esempio disopra:

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 unavalore decimale, prima di eseguire il codice; ecco unesempio:

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

Prima dei linguaggi .NET la regular expression Matchconteneva 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 unesempio:

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 tramitele nuove sintassi (?<nameOfGroup>...) o(?'nameOfGroup'...). Assegnare un nome ad ungroups 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 eversatili, possono provocare problemi di performance.Infatti, ad esempio, nelle espressioni regolari in VBScript oJScript c'è bisogno del' acquisizione ognivolta che vengono usate parentesi nelle regular expression;è possibile però che ci sia bisogno di usare leparentesi, senza però aver bisogno di un'acquisizione; ad esempio, se si vuole unire "Let'sgo this way" e "Let's go that way" , siuserà 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 diperformance, in quanto il testo catturato viene ricordato permezzo di un backreference.

Fortunatamente le regular expression in .NET supportano lasintassi (?:...) , che permette di raggrupparesenza incorrere in tali problemi di performance; ecco lasintassi corretta:

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


Continua a leggere la seconda parte dell'articolo>>