498 votes

Recherche et remplacement d'expressions régulières dans Sublime Text 2

Je cherche à faire des recherches et des remplacements avec des expressions régulières dans Sublime Text 2. Le site la documentation sur ce est plutôt anémique. Plus précisément, je veux faire un remplacement sur les groupes, donc quelque chose comme convertir ce texte :

Hello my name is bob

Et ce terme de recherche :

Trouvez quoi : my name is (\w)+

Remplacer par : my name used to be $(1)

Le terme de recherche fonctionne parfaitement, mais je n'arrive pas à trouver le moyen d'effectuer un remplacement à l'aide du groupe regexp.

662voto

Arkanon Points 3554

Habituellement, une référence arrière est soit $1 o \1 (backslash one) pour le premier groupe de capture (la première correspondance d'un motif entre parenthèses), et en effet Sublime supporte les deux syntaxes. Essayez donc :

my name used to be \1

ou

my name used to be $1

Notez également que votre modèle de capture original :

my name is (\w)+

est incorrect et ne capturera que la dernière lettre du nom plutôt que le nom entier. Vous devez utiliser le modèle suivant pour capturer toutes les lettres du nom :

my name is (\w+)

11 votes

Non, $0 n'est pas utilisé comme référence inverse dans une expression régulière (parce que \0 est égal au caractère nul, et \0ddd est utilisé comme échappement pour un caractère avec le point de code ddd). Cependant, $0 semble être utilisé dans Sublime2 comme une "marque de sortie" selon cette page (bien que j'aie du mal à trouver suffisamment d'exemples pour savoir exactement comment une marque de sortie est utilisée dans Sublime2).

4 votes

La marque de sortie $0 est utilisé dans Sublime Text 2/3 pour placer le curseur à la sortie d'une expansion de snippet. Plus d'informations sur les extraits .

3 votes

0$ fonctionne toujours pour le renvoi arrière de l'expression entière dans Sublime Text 2

111voto

CrnaStena Points 596

D'ailleurs, dans la question ci-dessus :

Pour :

Hello, my name is bob

Trouvez la pièce :

my name is (\w)+

Avec pièce de rechange :

my name used to be \1

Je reviendrais :

Hello, my name used to be b

Changez la partie trouvée en :

my name is (\w+)

Et le remplacement sera ce que vous attendez :

Hello, my name used to be bob

Alors que ( \w )+ correspondra à "bob", mais ce n'est pas le groupement que vous voulez pour le remplacement.

80voto

Hrvoje Golcic Points 638

Important : Utilisez le ( ) parenthèses dans votre chaîne de recherche

Bien que la réponse précédente soit correcte, il y a une chose importante à souligner ! Tous les les segments correspondants dans votre chaîne de recherche que vous voulez utiliser dans votre chaîne de remplacement doit être joint par ( ) parenthèses sinon ces segments appariés ne seront pas accessibles aux variables définies telles que $1 , $2 o \1 , \2 etc.

Par exemple, nous voulons remplacer "em" par "px" tout en conservant les valeurs numériques :

    margin: 10em;  /* Expected: margin: 10px */
    margin: 2em;   /* Expected: margin: 2px */
  • Corde de remplacement : margin: $1px o margin: \1px
  • Chaîne de recherche (CORRECT) : margin: ([0-9]*)em // avec parenthèses
  • Chaîne de recherche (INCORRECT) : margin: [0-9]*em

EXEMPLE DE CAS CORRECT : Utilisation de margin: ([0-9]*)em chaîne de recherche (entre parenthèses). Encadrez le segment apparié désiré (par ex. $1 o \1 ) par ( ) entre parenthèses comme suit :

  • Trouvez : margin: ([0-9]*)em (entre parenthèses)
  • Remplacer à : margin: $1px o margin: \1px
  • Résultat :

    margin: 10px;
    margin: 2px;

EXEMPLE DE CAS INCORRECT : Utilisation de margin: [0-9]*em chaîne de recherche (sans parenthèses). Le motif regex suivant correspondra aux lignes souhaitées mais les segments correspondants ne seront pas disponibles dans la chaîne remplacée comme variables telles que $1 o \1 :

  • Trouvez : margin: [0-9]*em (sans parenthèses)
  • Remplacer à : margin: $1px o margin: \1px
  • Résultat :

    margin: px; /* `$1` is undefined */
    margin: px; /* `$1` is undefined */

1 votes

Merci, cette réponse met en évidence un fait intéressant qui a résolu mon problème.

0 votes

Merci de l'avoir signalé. Avec (), je peux faire le remplacement avec \1 dans Sublime 3.

49voto

zeeawan Points 950

Voici une présentation visuelle de la réponse approuvée.

enter image description here

0 votes

Parce que $, [, (, et ) sont des caractères spéciaux, vous devez échapper à chaque caractère spécial avec une barre oblique inverse.

34voto

Andreas Haferburg Points 1960

Notez que si vous utilisez plus de 9 groupes de capture, vous devez utiliser la syntaxe suivante ${10} .

$10 o \10 o \{10} sera no travail.

0 votes

Merci ! Cela m'a été utile pour remplacer et ajouter un nombre à la fin du groupe capturé, par exemple pour ajouter un 1 au deuxième groupe de capture, vous devez utiliser des accolades telles que ${2}1 ; $21 fait référence au 21ème groupe de capture, qui n'existe pas.

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