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 |
| l | m | m | g | v | s | d |
---|
25 | 26 | 27 | 28 | 29 | 30 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 1 | 2 | 3 | 4 | 5 |
|
Statistiche |
- Views Home Page: 85.741
- Views Posts: 82.368
- Views Gallerie: 0
- n° Posts: 31
- n° Commenti: 18
|
|