Recherche d'expression régulière remplacer dans Sublime Text 2

440

Je cherche à remplacer la recherche par des expressions régulières dans Sublime Text 2. La documentation à ce sujet est plutôt anémique. Plus précisément, je veux faire un remplacement sur les groupes, donc quelque chose comme la conversion de ce texte:

Hello my name is bob

Et ce terme de recherche:

Trouver quoi: my name is (\w)+

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

Le terme de recherche fonctionne très bien, mais je ne peux pas trouver un moyen de faire un remplacement en utilisant le groupe regexp.

hackerhasid
la source

Réponses:

584

Habituellement, une référence arrière est soit $1ou \1(barre oblique inverse) pour le premier groupe de capture (la première correspondance d'un modèle entre parenthèses), et en effet Sublime prend en charge les deux syntaxes. Alors essayez:

my name used to be \1

ou

my name used to be $1

Notez également que votre modèle de capture d'origine:

my name is (\w)+

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

my name is (\w+)
Bobulous
la source
15
sauf, n'est-ce pas $0?
Skylar Saveland
11
Non, $ 0 n'est pas utilisé comme référence arrière dans une expression régulière (car \0est égal au caractère nul et \0dddest utilisé comme échappement pour un caractère avec le point de code ddd). Cependant, $0semble être utilisé dans Sublime2 comme une "marque de sortie" selon cette page (même si j'ai du mal à trouver suffisamment d'exemples pour déterminer exactement comment une marque de sortie est utilisée dans Sublime2).
Bobulous
3
La marque de sortie $0est utilisée dans Sublime Text 2/3 pour placer le curseur sur la sortie d'une extension d'extrait de code. Plus d'informations sur les extraits .
jrhorn424
2
$ 0 fonctionne toujours pour faire référence à toute l'expression dans Sublime Text 2
sturrockad
2
$0est la correspondance regex entière; $1est le premier groupe de capture.
Oletha
103

Soit dit en passant, dans la question ci-dessus:

Pour:

Hello, my name is bob

Trouver une pièce:

my name is (\w)+

Avec remplacer la pièce:

my name used to be \1

Retournerais:

Hello, my name used to be b

Remplacez la pièce de recherche par:

my name is (\w+)

Et remplacer sera ce que vous attendez:

Hello, my name used to be bob

Alors que (\ w) + correspondra à "bob", ce n'est pas le groupe que vous souhaitez remplacer.

CrnaStena
la source
52

Important: utilisez les ( )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 segments correspondants dans votre chaîne de recherche que vous souhaitez utiliser dans votre chaîne de remplacement doivent être placés ( )entre parenthèses , sinon ces segments correspondants ne seront pas accessibles aux variables définies telles que $1, $2ou \1, \2etc.

Par exemple, nous voulons remplacer 'em' par 'px' mais conserver les valeurs numériques:

    margin: 10em;  /* Expected: margin: 10px */
    margin: 2em;   /* Expected: margin: 2px */
  • Chaîne de remplacement: margin: $1pxoumargin: \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 la margin: ([0-9]*)emchaîne de recherche (entre parenthèses). Mettez le segment correspondant souhaité (par exemple $1ou \1) ( )entre parenthèses comme suit:

  • Rechercher: margin: ([0-9]*)em(entre parenthèses)
  • Remplacer par: margin: $1pxoumargin: \1px
  • Résultat:
    margin: 10px;
    margin: 2px;

EXEMPLE DE CAS INCORRECT: Utilisation de la margin: [0-9]*emchaîne de recherche (sans parenthèses). Le modèle d'expression régulière suivant correspondra aux lignes souhaitées, mais les segments correspondants ne seront pas disponibles dans la chaîne remplacée en tant que variables telles que $1ou \1:

  • Rechercher: margin: [0-9]*em(sans parenthèses)
  • Remplacer par: margin: $1pxoumargin: \1px
  • Résultat:
    margin: px; /* `$1` is undefined */
    margin: px; /* `$1` is undefined */
Hrvoje Golcic
la source
1
Merci, cette réponse souligne vraiment un fait intéressant qui a résolu mon problème.
Enkk
Merci de l'avoir signalé. Avec (), je peux faire le remplacement par \ 1 dans Sublime 3.
Jeffrey
47

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

entrez la description de l'image ici

Zeeawan
la source
pourquoi ne trouve pas $_SESSION[(\w+)? merci
Toni Michel Caubet
Parce que $, [, (et) sont des caractères spéciaux, vous devez donc échapper chaque caractère spécial avec une barre oblique inverse.
zeeawan
25

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

$10ou \10ou \{10}ne pas fonctionner.

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

Regarder l'article de la documentation non officielle de Sublime Text sur la recherche et le remplacement , il semble que +(.+)c'est le groupe de capture que vous voudrez peut-être ... mais j'ai personnellement utilisé (.*)et cela a bien fonctionné. Pour REMPLACER comme vous le dites, vous aimerez peut-être cette conversation dans les forums , en particulier ce message qui dit d'utiliser simplement $1pour utiliser le premier groupe capturé.

Et puisque les images valent mieux que les mots ...

Avant: avant de trouver / remplacer

Après: après avoir trouvé / remplacé

Blairg23
la source