web-dev-qa-db-fra.com

La recherche par expression régulière remplace dans Sublime Text 2

Je cherche à remplacer les expressions régulières par des expressions régulières dans Sublime Text 2. Le documentation à ce sujet est plutôt anémique. Plus précisément, je souhaite effectuer un remplacement sur les groupes, ce qui revient à convertir ce texte:

Hello my name is bob

Et ce terme de recherche:

Trouver quoi: my name is (\w)+

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

Le terme de recherche fonctionne très bien, mais je ne trouve pas de moyen de remplacer le groupe à l’aide du groupe regexp.

414
hackerhasid

Habituellement, une référence arrière est $1 ou \1 (barre oblique inverse) pour le premier groupe de capture (la première correspondance d'un motif entre parenthèses). Alors peut-être essayer:

my name used to be \1

ou

my name used to be $1

PDATE: Comme l'ont souligné plusieurs personnes, votre modèle de capture d'origine est incorrect et ne capture 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+)
550
Bobulous

À propos, dans la question ci-dessus:

Pour:

Hello, my name is bob

Trouver une partie:

my name is (\w)+

Avec remplacer partie:

my name used to be \1

Retournerais:

Hello, my name used to be b

Remplacez la recherche par:

my name is (\w+)

Et remplacer sera ce que vous attendez:

Hello, my name used to be bob

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

101
CrnaStena

Utilisez les parenthèses () dans votre chaîne de recherche

Il y a une chose importante à souligner! Tous les segments correspondants dans votre chaîne de recherche que vous voulez utiliser dans votre chaîne de remplacement doivent être entourés de () parenthèses, sinon ces segments correspondants ne sera pas accessible avec des variables telles que $ 1, $ 2, ... ni\1,\2, .. et etc.

EXEMPLE:

Nous voulons remplacer "em" par "px" mais conserver les valeurs numériques:

margin: 10em
margin: 2em

Nous utilisons donc le margin: $1px comme chaîne de remplacement.


CORRECT: Embrassez le segment correspondant $1 correspondant par ( ) parenthèses comme suit:

FIND: margin: ([0-9]*)em (avec des parenthèses)

REMPLACER PAR: margin: $1px

RÉSULTAT:

margin: 10px
margin: 2px

WRONG: 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 sous forme de variables telles que $1:

TROUVER: margin: [0-9]*em (sans parenthèses)

REMPLACER PAR: margin: $1px

RÉSULTAT: ($1 n'est pas défini)

margin: px
margin: px
46
Hrvoje Golcic

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

enter image description here

44
zeeawan

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

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

21
Andreas Haferburg

En regardant article de la documentation non officielle de Sublime Text sur la recherche et le remplacement , il semble que +(.+) soit le groupe de capture que vous souhaitez peut-être ... mais j'ai personnellement utilisé (.*) et cela a bien fonctionné . Pour REMPLACER comme vous le dites, vous pourriez aimer ceci conversation dans les forums , plus précisément cet article qui dit simplement utiliser $1 pour utiliser le premier capturé groupe.

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

Avant: before find/replace

Après: after find/replace

1
Blairg23