Eclipse, recherche et remplacement d'expressions régulières

119

Dans eclipse, est-il possible d'utiliser la chaîne de recherche correspondante dans le cadre de la chaîne de remplacement lors de l'exécution d'une recherche et d'un remplacement d'expression régulière?

Fondamentalement, je souhaite remplacer toutes les occurrences de

variableName.someMethod()

avec:

((TypeName)variableName.someMethod())

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

Dans sed, je pourrais utiliser quelque chose comme:

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

Autrement dit, & représente la chaîne de recherche correspondante. Y a-t-il quelque chose de similaire dans Eclipse?

Merci!

Greg
la source
Bonne documentation sur Eclipse RegEx: help.eclipse.org/kepler/…
Kolob Canyon

Réponses:

225

Oui, "()" capture un groupe. vous pouvez l'utiliser à nouveau avec $ i où i est le ième groupe de capture.

Alors:

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

remplacer: ((TypeName)$1)

Astuce: CTRL+ Spacedans les zones de texte vous donne toutes sortes de suggestions pour l'écriture d'expressions régulières.

Pas d'hommes
la source
C'est une bonne réponse et un indice utile. Cela aurait été plus utile s'il avait été décrit un peu plus en détail.
iammilind
Bravo Eclipse, vous avez bien implémenté cette fonctionnalité!
Kenogu Labz
J'adore particulièrement l'exemple pour "Code hexadécimal pour caractère Unicode" :)
Stewart Murrie
J'aimerais ajouter du code qui m'a vraiment aidé. J'avais besoin de tout remplacer stringVar.equals("xxx")par "xxx".equals(stringVar). J'ai utilisé l'expression rationnelle suivante dans la boîte de dialogue de recherche / remplacement: search: ([^()! ]+).equals\("(.*)"\), replace: "$2".equals\($1\).
LaDude
Pas pour moi. Remplace toujours le premier groupe ...?
RightmireM
6

Utilisation de ...
search = (^. * Import) (. *) (\ (. * \) :)
replace = $ 1 $ 2

... remplace ...

from checks import checklist(_list):

...avec...

from checks import checklist



Les blocs dans l'expression régulière 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 suivant " tout "jusqu'au prochain rencontré" ("et le charge à $ 2. $ 2 s'arrête au" ("à cause de la partie suivante (voir la ligne suivante ci-dessous)

(\ (. * \) :) dit" au premier rencontré "( "après le début du bloc $ 2 ... arrêtez le bloc $ 2 et démarrez $ 3. $ 3 est chargé avec le" ('any text'): "ou, dans l'exemple, le" (_list): "

Ensuite, dans le remplacement, mettez simplement le 1 $ 2 $ pour remplacer les trois blocs par les deux premiers seulement.



Capture d'écran

RightmireM
la source
3

NomeN a répondu correctement, mais cette réponse ne serait pas d'une grande utilité pour les débutants comme moi car nous aurons 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:

À la recherche:

  • Le premier et le dernier '(' ')' représente un groupe en regex

  • '\ w' représente des mots (alphanumérique + trait de soulignement)

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

  • '.' est un caractère spécial qui représente n'importe quel caractère (ie. + signifie un ou plusieurs caractères de n'importe quel caractère). Parce que c'est un caractère spécial pour représenter un '.' nous devrions lui donner un caractère d'échappement, c'est-à-dire '.'

  • 'someMethod' est donné tel qu'il doit être recherché.

  • Les deux parenthèses '(', ')' sont données avec le caractère d'échappement car ce sont des caractères spéciaux qui sont utilisés pour représenter un groupe (nous discuterons du groupe dans le point suivant)

En remplacement:

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

  • Assurez-vous également d'avoir coché l'option 'Expression régulière' dans la case Rechercher une case à remplacer

Vous trouverez plus d'informations sur RegEx sur http://regexr.com/ .

padippiste
la source
2

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

replace: ((TypeName)$0)
Yaroslav Lyakh
la source
5
Ce n'est pas vrai afaik. Le $ 0 représente l'ensemble du terme de recherche d'origine. Dans ce cas, je suppose que cela fonctionnerait par hasard.
Walter Heck
0

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

entrez la description de l'image ici

Je veux renommer

/download.mp4^lecture_id=271

à

/271.mp4

Et il peut y en avoir plusieurs.

Voici comment procéder.

entrez la description de l'image ici

Puis appuyez sur le bouton Rechercher / Remplacer

MadNik
la source