Michael Denny's Blog ;]


Tutto quello che non avresti mai voluto sapere sulle Regular Expression...e se sei qui ti tocca!
Archivio Posts
Anno 2017

Anno 2015

Anno 2014

Anno 2013

Anno 2012

Anno 2010

Anno 2008

Anno 2007

[RegEx In Practice] - Estrarre parametri da una funzione / metodo con funzioni come parametro

In questo esempio andremo ad estrarre i parametri da una chiamata a funzione / metodo, riuscendo anche ad estrarre le eventuali funzioni passata come parametro.

Tutto nasce da un aiuto che mi è stato chiesto in questi giorni, proprio riguardante l'oggetto in questione, e la domanda originale era se fosse stato possibile con la funzione di Regex.Split di .net estrarre le tre parti di una chiamata a funzione, ma li per li, sinceramente non mi è venuta la soluzione con il metodo split, perchè lo split prevede che il pattern regex passato sia il separatore stesso, e creare una regular per un separatore che escluda la virgola interna a sotto funzioni, non lo trovo così immediato, anche se probabilmente si riuscirebbe ad ottenere lo stesso risultato, sfruttando a pieno le funzionalità di lookaround (negative positive lookahead e lookbehind), ma per il caso in questione direi che comunque la soluzione che mi è venuta in mente su due piedi può andare.

Estrapolare da questa stringa:

FUN1(A,FUN2(A,B), FUN3(A))

Un array con:

A
FUN2(A,B)
FUN3(A)

Soluzione:

string input = @"FUN1(A,FUN2(A,B), FUN3(A))";
string pattern = @"^[^\(]+\((?:((?=,)|[^\(,]+\([^\)]+\)|[^,]+),?\s*)+\)$";
Match match = Regex.Match(input, pattern, RegexOptions.IgnoreCase);
List<string> found = new List<string>();
foreach (Capture capture in match.Groups[1].Captures)
{
found.Add(capture.Value);
}

Il pattern dell'esempio, si aspetta almeno di trovare un apertura della funzione xxx(.......) e poi al suo interno deve avere 1 o più parametri in qualsiasi forma delimitati dalla virgola, e accetta che eventualmente ci sia anche un'altra funzione o più al suo interno, ma si ferma a 2 livelli di profondità, cioè se all'interno della FUN2 ci fosse un'altra funzione, il pattern deve subire un ulteriore evoluzione prima che accetti anche quella forma, ma si andrebbe a complicare ulteriormente. Dentro a found vi troverete la lista contenente esattamente il risultato aspettato { "A", "FUN2(A,B)", "FUN3(A)" }


That's All Folks
Michael
giovedì, 05 apr 2012 Ore. 00.48
Calendario
aprile 2024
lmmgvsd
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345





Statistiche
  • Views Home Page: 82.388
  • Views Posts: 80.147
  • Views Gallerie: 0
  • n° Posts: 31
  • n° Commenti: 18
Copyright © 2002-2007 - Blogs 2.0
dotNetHell.it | Home Page Blogs
ASP.NET 2.0 Windows 2003