Dans le cadre d’un de mes projets, j’ai récemment eu à remplacer dans tout un projet décompilé (généré par ILSpy sur du Compact Framework 3.5 …) le type de code suivant :
int i = 17;
List<string> l = new List<string>();
l.get_Item(12) = "une chaine";
l.get_Item(i) = "une autre chaine";
[/sourcecode]
par celui-ci :
int i = 17;
List<string> l = new List<string>();
l[12] = "une chaine";
l[i] = "une autre chaine";
[/sourcecode]
Aparté : J’en suis arrivé à ce code, car Il semble qu’ILSpy ne gère pas très bien le code compilé pour le Compact Framework, d’où la récupération de ces get_Item au lieu de l’indexeur classique. J’ai eu le même problème avec les propriétés qui étaient toutes de la forme .get_NomPropriete() ou .set_NomPropriete().
Je me suis naturellement tourné vers le remplacement dans Visual Studio par des expressions régulières (Je n’aborderai pas ici leur utilisation, pour plus d’informations je vous invite à consulter le site du zéro : http://fr.openclassrooms.com/informatique/cours/concevez-votre-site-web-avec-php-et-mysql/les-expressions-regulieres-partie-1-2 ou ce site (en anglais) http://www.regular-expressions.info/)
Il se trouve en fait que le comportement des expressions régulières a changé dans Visual Studio 2012 comme décrit succinctement dans la MSDN :
Pour plus d’informations sur les expressions régulières utilisées dans les modèles de remplacement, consultez Substitutions dans les expressions régulières. Pour utiliser un groupe de captures numérotées, la syntaxe est $1 pour spécifier le groupe numéroté et (x) pour spécifier le groupe en question. Par exemple, l’expression régulière groupée (d)([a-z]) recherche quatre correspondances dans la chaîne suivante : 1a 2b 3c 4d. La chaîne de remplacement z$1 convertit cette chaîne en z1 z2 z3 z4> La syntaxe équivalente dans Visual Studio 2010 est {:z}([a-z]) pour l’expression régulière groupée et z1 pour la chaîne de remplacement.
L’expression régulière “officielle” pour effectuer une rechercher est la suivante : .get_Item((w+))où ((w+) représente le groupe à conserver et à réinsérer.
Sous Visual Studio 2012 et supérieur, le remplacement se fait de la manière suivante :
- $1 correspond au 1er groupe de l’expression régulière (dans notre exemple : “12” puis “i”)
- représentant la recherche par expressions régulières
Sous Visual Studio 2008 ou 2010, le mécanisme est légèrement différent :
- L’expression régulière utilisée est : .get_Item({:a+}) où
- “:a” correspondà un caractère alphanumérique
- “{}” la définition d’un groupe
- La récupération du groupe se fait par la syntaxe “1”