136 votes

Eclipse, recherche et remplacement par expression régulière

Dans eclipse, est-il possible d'utiliser la chaîne de recherche trouvée comme partie de la chaîne de remplacement lors d'une recherche et d'un remplacement par expression régulière ?

En gros, je veux remplacer toutes les occurrences de

variableName.someMethod()

avec :

((TypeName)variableName.someMethod())

variableName peut être n'importe quel nom de variable.

En sed Je pourrais utiliser quelque chose comme :

s/[a-zA-Z]+\.someMethod\(\)/((TypeName)&)/g

C'est-à-dire, & représente la chaîne de recherche trouvée. Existe-t-il quelque chose de similaire dans Eclipse ?

Merci !

0 votes

Bonne documentation sur Eclipse RegEx : aide.eclipse.org/kepler/

248voto

NomeN Points 4106

Oui, « () » capture un groupe. vous pouvez l’utiliser à nouveau avec $i où i est le groupe de capture d’IE.

donc :

Astuce : CTRL + espace dans les zones de texte vous donne toutes sortes de suggestions pour l’écriture d’expressions régulières. (Je crains que la touche Bas, pour aller vers le bas de la liste de suggestions, ne supprime pas votre entrée dans la zone de texte. Irritant petit bug)

0 votes

C'est une bonne réponse et une indication utile. Elle aurait été plus utile si elle avait été décrite de manière un peu plus détaillée.

0 votes

Bravo Eclipse, vous avez implémenté cette fonctionnalité correctement !

0 votes

J'aime particulièrement l'exemple de "code hexadécimal pour un caractère Unicode" :)

8voto

BurningKrome Points 70

Utilisation de ...
recherche = (^.*import )(.*)(\(.*\) :)
remplacer = 1$2

...remplace ...

from checks import checklist(_list):

...avec...

from checks import checklist

Les blocs dans les regex sont délimités par des parenthèses (qui ne sont pas précédées d'un "\")

(^.*import ) trouve "from checks import " et le charge à $1 (eclipse commence à compter à 1)

(.*) trouve le prochain "tout" jusqu'au prochain "(" rencontré et le charge dans $2. $2 s'arrête au "(" à cause de la partie suivante (voir la ligne suivante ci-dessous)

(\(.*\) :) dit "à la première rencontre de "(" après avoir commencé le bloc 2... arrêtez le bloc 2 et commencez 3. 3 est chargé avec le "('n'importe quel texte') :" ou, dans l'exemple, le "(_liste) :".

Ensuite, dans le remplacement, il suffit de mettre le $1$2 pour remplacer les trois blocs par seulement les deux premiers.

Screenshot

6voto

padippist Points 537

NomeN a répondu correctement, mais cette réponse ne serait pas d'une grande utilité pour les débutants comme moi car nous aurions un autre problème à résoudre et nous ne saurions pas comment utiliser RegEx là-dedans. J'ajoute donc un peu d'explication à cela. La réponse est

recherche : (\w+\\.someMethod\\(\\))

remplacer : ((TypeName)$1)

Ici :

En recherche :

  • Premier et dernier ( , ) représente un groupe en regex

  • \w représente des mots (alphanumériques + soulignement)

  • + représente un ou plusieurs (c'est-à-dire un ou plusieurs éléments alphanumériques + trait de soulignement)

  • . est un caractère spécial qui représente n'importe quel caractère (c'est-à-dire .+ signifie un ou plusieurs de n'importe quel caractère). Comme il s'agit d'un caractère spécial pour représenter un . nous devrions donner un caractère d'échappement avec lui, c'est-à-dire \.

  • someMethod est donnée telle qu'elle doit être recherchée.

  • Les deux parenthèses ( , ) sont donnés avec le caractère d'échappement parce que ce sont des caractères spéciaux utilisés pour représenter un groupe. (nous parlerons des groupes au point suivant).

En remplacement :

  • Il est donné ((TypeName)$1) ici $1 dépeint le groupe. C'est-à-dire tous les caractères qui sont compris entre la première et la dernière et de la dernière parenthèse ( , ) dans le champ de recherche

  • Assurez-vous également que vous avez coché l'option "Expression régulière" dans la boîte de recherche de remplacement. boîte de recherche et de remplacement

2voto

l_yara Points 41

Au moins chez STS (SpringSource Tool Suite) les groupes sont numérotés à partir de 0, donc la chaîne de remplacement sera

replace: ((TypeName)$0)

5 votes

Ce n'est pas vrai afaik. Le 0 $ représente l'intégralité du terme de recherche original. Dans ce cas, je suppose que cela pourrait fonctionner par coïncidence.

0voto

MadNik Points 1131

Pour quelqu'un qui a besoin d'une explication et d'un exemple sur la façon d'utiliser un regxp dans Eclipse. Voici mon exemple illustrant le problème.

enter image description here

Je veux renommer

/download.mp4^lecture_id=271

à

/271.mp4

Et il peut y en avoir plusieurs.

Voici comment il faut procéder.

enter image description here

Ensuite, appuyez sur le bouton Rechercher/Remplacer

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X