Dans Eclipse, est-il possible d’utiliser la chaîne de recherche correspondante dans la chaîne de remplacement lors de la recherche et du remplacement par une expression régulière?
Fondamentalement, je veux remplacer toutes les occurrences de
variableName.someMethod()
avec:
((TypeName)variableName.someMethod())
Où nomVariable peut être n'importe quel nom de variable.
Dans sed je pourrais utiliser quelque chose comme:
s/[a-zA-Z]+\.someMethod\(\)/((TypeName)&)/g
En d'autres termes, & représente la chaîne de recherche correspondante. Y at-il quelque chose de similaire dans Eclipse?
Merci!
Oui, "()" capture un groupe. vous pouvez l'utiliser à nouveau avec $ i où i est le groupe de capture ieme.
alors:
search: (\w+\.someMethod\(\))
replace: ((TypeName)$1)
indice: 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 descendre la liste des suggestions, efface votre saisie dans la zone de texte. Irritant petit bug)
En utilisant ...
search = (^. * import) (. *) (\ (. * \) :)
remplace = 1 $ 2 $
... remplace ...
from checks import checklist(_list):
...avec...
from checks import checklist
Les blocs dans les expressions rationnelles sont délimités par des parenthèses (qui ne sont pas précédées d'un "\")
(^. * import) trouve "à partir de chèques import" et le charge à 1 $ (Eclipse commence à compter à 1)
(. *) trouve le prochain "tout" jusqu'au prochain "(") et le charge à 2 $. 2 $ s'arrête au "(" en raison de la partie suivante (voir la ligne suivante ci-dessous)
(\ (. * \) :) dit "à la première rencontre" ("après le début du bloc $ 2 ... arrêter le bloc $ 2 et démarrer $ 3. $ 3 est chargé avec le" ('tout texte'): "ou , dans l'exemple, le "(_list):"
Ensuite, dans le remplacement, il suffit de mettre le $ 1 $ 2 pour remplacer les trois blocs avec seulement les deux premiers.
NomeN a répondu correctement, mais cette réponse ne serait pas très utile pour les débutants comme moi, car nous aurons un autre problème à résoudre et nous ne saurions pas comment utiliser RegEx ici. J'ajoute donc un peu d'explication à cela. La réponse est
recherche: (\ w + \. someMethod\(\))
remplace: ((TypeName) $ 1)
Ici:
À la recherche:
Premier et dernier '(' '') représente un groupe en regex
'\ w' représente des mots (alphanumérique + trait de soulignement)
'+' représente un ou plusieurs (c.-à-d. un ou plusieurs caractères soulignés alphanumériques)
'.' est un caractère spécial qui décrit n’importe quel caractère (ie. + signifie un ou plusieurs de tous les caractères). Parce que c’est un caractère spécial. Pour représenter un '.' nous devrions lui donner un caractère d'évasion, c'est-à-dire '.'
'someMethod' est donné car 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 utilisés pour décrire 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-à-dire tous les caractères compris entre la première .__ et la dernière parenthèse '(', ')' dans le champ de recherche
Assurez-vous également que vous avez coché l'option "Expression régulière" dans Trouver une boîte de remplacement.
Vous trouverez plus d’informations sur RegEx dans http://regexr.com/ .
Au moins chez STS (SpringSource Tool Suite), les groupes sont numérotés à partir de 0, ainsi la chaîne de remplacement sera
replace: ((TypeName)$0)
Si vous avez besoin d'une explication et d'un exemple d'utilisation de regx sur Eclipse, espérons que cela sera utile. Voici mon problème.
Je veux renommer
/download.mp4^lecture_id=271
à
/271.mp4
Et il peut y en avoir beaucoup.
Comment vous devriez faire ceci est.
Puis cliquez sur le bouton Rechercher/Remplacer
Je cherchais regex pour supprimer les espaces vides dans la ligne vide. Voici la regex à trouver:
^\s *\r?\n
et remplacer par
\ n
Utilisez-le simplement dans l'assistant de recherche et de remplacement, il fonctionnera à 100%.