Comment référencer un groupe de capture avec la recherche et le remplacement d'expression régulière dans Visual Studio 2012, 2013, 2015 et VS Code


255

Je me rends compte qu'il y a une tonne de questions à ce sujet, mais aucune que j'ai trouvée ne faisait spécifiquement référence à la version VS à laquelle ils faisaient référence. Avec cette importante information manquante, je n'ai toujours pas pu utiliser avec succès les réponses que j'ai trouvées. Le plus courant était

  • Entourez avec {}, affichez la capture avec \ 1, \ 2, \ n

Cependant, cela semble être l'ancienne méthode de recherche et de remplacement d'expression régulière dans Visual Studio, et cela ne fonctionne pas dans VS 2012.


1
Ce n'est pas trop difficile à trouver dans l'aide: dans la boîte de dialogue Rechercher / Remplacer, F1; au début de la recherche et du remplacement de texte, il existe un lien vers l' utilisation d'expressions régulières dans VS ; là, le 2e conseil vous renvoie aux substitutions dans les expressions régulières ; là, il vous donne les bases et dit qu'il y a plus de détails sous Substitution d'un groupe numéroté et Substitution d'un groupe nommé .
PJTraill

2
@PJTraill c'est bien de savoir qu'ils ont facilité la réponse à une question pour leur version 2012 entre 2013 et 2015. Par les votes cependant, je pense qu'il est assez évident qu'il n'est toujours pas "pas trop difficile" de trouver dans l'aide. IMO: S'il est plus facile de rechercher et de voter sur un article de débordement de pile que d'utiliser la recherche, le remplacement, la capture sans rechercher d'aide, alors c'est beaucoup plus difficile qu'il ne devrait l'être.
SgtPooki

Une chose qui me dérange à propos de MSVS 2012/3 est les deux différents dialogues de recherche / remplacement, en particulier le plus petit (Ctrl-H), où je continue accidentellement (avec des touches qui signifient probablement autre chose ailleurs) de modifier la portée de la recherche . Mais le point que je veux faire est que la plus grande boîte de dialogue (Ctrl-Maj-H) a des boutons après les champs Rechercher et Remplacer qui vous donnent une liste des possibilités les plus importantes, y compris ce que vous recherchez - donc vous ne le faites pas Besoin d'aide! Je suppose que beaucoup de gens ne voient pas les boutons ou atterrissent dans la boîte de dialogue Ctrl-H et ne peuvent pas les voir.
PJTraill

Je suis d'accord que l'aide est un peu compliquée à trouver; Je soupçonne qu'ils accordent la priorité à la recherche en texte brut. Mon point est plus que si l'on sait ou suppose qu'il doit être là, on peut le trouver assez facilement; tous trop souvent, je suis cette voie, car je préfère utiliser la documentation canonique une fois que je peux la trouver. Je ne voulais pas paraître désobligeant; Je pense que c'est à la fois «trop dur» et «pas trop dur» - ils ne sont pas opposés si vous voyez «pas trop» comme qualifiant de «dur» et ajoutez la réponse à l'implicite «dur pour quoi?».
PJTraill

Je "savais" que le marquage REGEXP utilisait '()', relisez la documentation, et cela n'a pas fonctionné ... alors je suis venu ici pour m'assurer ... puis j'ai fait plus d'expérimentation, et cela a fonctionné. Donc, à mon humble avis, la documentation MSDN doit être très claire: () sont utilisés pour "baliser" une expression, pour ceux d'entre nous qui ont dû apprendre l'ancienne nomenclature des "balises" VS6. Ce serait bien s'ils pouvaient utiliser la même nomenclature. Les groupes numérotés ... ne déclenchent pas assez bien les synapses à mon humble avis.
Ross Youngblood

Réponses:


356

Pour rechercher et remplacer dans VS 2012 et VS 2015, procédez comme suit:

Exemple (grâce à syonip)

Dans les options de recherche, assurez-vous que `` utiliser des expressions régulières '' est coché, et mettez ce qui suit comme texte à rechercher:

_platformActions.InstallApp\((.+)\)

Et ce qui suit comme texte pour le remplacer par:

this.Platform().App($1).Install()

Remarque: Comme SLaks le fait remarquer dans un commentaire ci-dessous, le changement de syntaxe d'expression régulière est dû au passage de VS2012 au moteur d'expression régulière .Net standard.

Remarque: Un autre intervenant a souligné que cela fonctionne également dans Visual Studio Code (vscode)


10
Pour être plus général, VS2012 utilise maintenant le moteur d'expression régulière .Net standard.
SLaks

4
N'avez-vous pas besoin d'échapper au caractère d'époque entre _platformActionset InstallApp?
rory.ap

En y réfléchissant maintenant, cela aurait du sens. Je ne l'ai pas testé. N'hésitez pas à y apporter un montage.
SgtPooki

1
En fin de compte, j'ai utilisé le nom car le numérique ne semble pas fonctionner pour moi au moins. (?<rval>.+)à la recherche et en remplacement${rval}
Mark Schultheiss

2
Une aide supplémentaire: si vous voulez remplacer la chose (. *) Par la chose 18 $ (en ajoutant un '8' directement après la capture), vous devrez utiliser la chose $ {1} 8
Luc Bloom

17

Pour ajouter un exemple de ceci, voici quelque chose que je devais faire dans mon code:

Trouver quoi:

_platformActions.InstallApp\((.+)\)

Remplacer par:

this.Platform().App($1).Install()

Cela remplace tout appel à InstallApp (x), par this.Platform (). App (x) .Install ().

* N'oubliez pas de cocher "Utiliser les expressions régulières" dans les options de recherche


10

Si vous souhaitez utiliser des noms de groupe (en utilisant le même exemple que ci-dessus):

Trouver quoi:

_platformActions\.InstallApp\((?<mygroupname>.+)\)

Remplacer par:

this.Platform().App(${mygroupname}).Install()

9

Pour améliorer les réponses ci-dessus: vous devez remplacer

_platformActions.InstallApp\((.+)\)

avec

this.Platform().App(${1}).Install()

Faites attention au $ {1} si vous voulez ajouter un chiffre derrière la capture. $18va essayer d'insérer la 18e capture de recherche, pas la première avec une 8annexe.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.