Rechercher / remplacer avec des expressions régulières dans Visual Studio

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 :

[sourcecode language= »csharp » padlinenumbers= »true » htmlscript= »false » toolbar= »true »]
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 :

[sourcecode language= »csharp »]
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+))((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 :

VS2012regexp

  • $1 correspond au 1er groupe de l’expression régulière (dans notre exemple : “12” puis “i”)
  • image représentant la recherche par expressions régulières

Sous Visual Studio 2008 ou 2010, le mécanisme est légèrement différent :

image

  • L’expression régulière utilisée est : .get_Item({:a+})
    • “: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