54 votes

Comment rechercher et remplacer 2 lignes (ensemble) dans Eclipse ?

Je voudrais rechercher dans plusieurs fichiers via eclipse les 2 lignes suivantes :

@Length(max = L_255)
private String description;

et les remplacer par ces deux-là :

@Length(max = L_255, message="{validator.description.len}")
private String description;

1 votes

J'ai fait la ligne en tant que code pour montrer que c'est sur 2 lignes. CTRL+H ne me permet pas d'ajouter 2 lignes pour la recherche et le remplacement.

67voto

Mario Balaban Points 261

Une autre astuce pour obtenir l'expression rationnelle pour un bloc sélectionné. Ouvrez l'un des fichiers qui contient les lignes multiples (multilignes) à rechercher ou à remplacer. Cliquez sur Ctrl + F et sélectionnez "Expression régulière". Fermez la fenêtre Rechercher/Remplacer. Sélectionnez le bloc dont vous avez besoin et cliquez à nouveau Ctrl + F pour ouvrir la fenêtre Rechercher/Remplacer. Dans la zone de texte Rechercher, vous avez maintenant l'expression régulière qui correspond exactement à votre bloc de sélection.

(J'ai découvert cela, seulement après avoir créé manuellement une regexp pour un très long bloc :)

0 votes

Excellente astuce ! Merci, vous m'avez fait gagner beaucoup de temps pour trouver comment construire ma regex.

1 votes

Vous pouvez également utiliser cette astuce pour construire l'expression rationnelle à copier dans une recherche de fichier. Un énorme gain de temps, merci !

0 votes

C'est une fonction très intéressante, mais elle n'a pas résolu mon problème.

44voto

VonC Points 414372

Les recherches sont multi-lignes par défaut dans Eclipse lorsque vous utilisez une expression rationnelle :

(\@Length\(max = L_255)\)([\r\n\s]+private)

Je voudrais ajouter "private String description ;"

(\@Length\(max = L_255)\)([\r\n\s]+private\s+?String\s+description\s*?;)

remplacé par :

\1, message="{validator.description.len}")\2

Il fonctionne parfaitement dans une recherche de fichier déclenchée par un CTRL - H .

Eclipse multi-line search

Comme mentionné dans Tika 's réponse vous pouvez copier directement les deux lignes sélectionnées dans le champ "Containing Text". : ces lignes seront converti en regexp pour vous par Eclipse.

0 votes

Je voudrais ajouter "private String description ;" également dans le cadre de ma recherche puisque la ligne @Length(max = L_255) est également présente pour d'autres champs comme "private String name". La suggestion ci-dessus ne fonctionnera donc pas.

0 votes

J'essaie d'effectuer une recherche sur plusieurs lignes successives.

1 votes

@Samuel : image ajoutée, réponse mise à jour pour prendre en compte votre ligne complète. Cela fonctionnera pour plusieurs lignes successives. Essayez-le.

20voto

Tika Points 38

CTRL+H prend deux lignes si vous utilisez une regexp (et vous n'avez pas besoin d'écrire la regexp par vous-même, eclipse le fait pour vous).

  1. Sélectionnez vos lignes.
  2. Cliquez sur CTRL+H. Le dialogue de recherche s'ouvre. Si "Expression régulière" est déjà cochée, eclipse aura converti pour vous les deux lignes que vous recherchez en regexp, cliquez sur Rechercher. Si "Expression régulière" n'est pas déjà cochée, cochez-la et cliquez sur Annuler (eclipse se souvient de votre choix).
  3. Sélectionnez à nouveau vos lignes.
  4. Cliquez sur CTRL+H. La boîte de dialogue de recherche s'ouvre. Cette fois-ci, "Expression régulière" est déjà sélectionné. Eclipse aura converti pour vous les deux lignes que vous recherchez en regexp, cliquez sur Rechercher.

2 votes

Je préfère votre description de la solution, simple, rapide et infaillible. Merci !

0 votes

La 2ème ligne est un joyau caché. Merci.

4voto

Steve Chambers Points 3303

Une astuce rapide pour inclure plusieurs lignes dans une expression régulière construite manuellement :

Où vous utiliseriez normalement .* pour faire correspondre un caractère zéro fois ou plus, envisagez plutôt d'utiliser quelque chose comme (?:.|\r?\n)* . Ou mettez un supplément ? à la fin pour le rendre non gourmand.

Explication : . ne correspond pas aux nouvelles lignes, il faut donc faire un "ou bien" : Les parenthèses correspondent soit à la . avant le tuyau ou la nouvelle ligne après celui-ci. Le site ? après \r rend le retour chariot avant le saut de ligne facultatif pour permettre les nouvelles lignes Windows ou Unix. Le site ?: exclut l'ensemble en tant que groupe de capture (ce qui permet d'éviter un débordement de pile).

2 votes

Lorsque j'essaie ceci dans Eclipse (4.5) comme : publisher(?:.|\r?\n)* il montre une erreur dans le dialogue "Find pattern too complex" Edit : ajouter le point d'interrogation à la fin comme : publisher(?:.|\r?\n)*? le fait fonctionner ! Merci pour l'astuce et l'explication des regex.

2 votes

Dans certains cas, si j'ajoute trop de caractères dans le deuxième mot que je veux rechercher, l'erreur "Find pattern too complex" s'affiche toujours. Ainsi, publisher(?:.|\r?\n)*?id fonctionne mais publisher(?:.|\r?\n)*?identification affiche l'erreur

0voto

Bart van Heukelom Points 11977

Sélectionnez le dossier qui contient tous vos fichiers et appuyez sur Ctrl + H .

0 votes

Faites les lignes séparément ? Ou essayez une expression régulière multiligne.

0 votes

Je ne peux pas le faire séparément car cela pourrait affecter d'autres champs. Je n'ai pas réussi à trouver l'expression multiligne qui identifiera correctement les deux lignes ci-dessus, d'où ma question.

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