VSCode regex trouver et remplacer les mathématiques de sous-match?

205
%s@{fileID: \(213[0-9]*\)@\='{fileID: '.(submatch(1)-1900)@

J'utilise cette commande regex search and replace dans vim pour soustraire une constante de chaque identifiant correspondant.

Je peux faire le regex trouver dans VSCode, mais comment puis-je référencer le submatchpour les maths et remplacer? submatch(1)ne fonctionne pas dans VSCode?

Merci.

Rakka Rage
la source

Réponses:

345

Étant donné une expression régulière de (foobar)vous pouvez référencer le premier groupe en utilisant $1et ainsi de suite si vous avez plus de groupes dans le champ de saisie de remplacement.

Benjamin Pasero
la source
demandé à nouveau différemment ici: stackoverflow.com/questions/35283300/…
Rakka Rage
4
J'ai dû remplacer <p>(.*)</p>par <p>\n\t\t\t\t\t\t$1\n\t\t\t\t\t</p>un fichier de 2000 lignes. Imaginez-moi le faire manuellement.
Bishwas Mishra
100

Pour compléter la réponse de Benjamin avec un exemple:

Find        Carrots(With)Dip(Are)Yummy
Replace     Bananas$1Mustard$2Gross
Result      BananasWithMustardAreGross

Tout ce qui est entre parenthèses peut être une expression régulière.

Shaun Luttin
la source
Celui-ci m'a rappelé que je devrais échapper à la parenthèse si je fais une expression régulière sur l'instruction if.
Clockwork
65

Juste pour ajouter un autre exemple:

Je remplaçais src attr dans les balises html img, mais j'avais besoin de remplacer uniquement le src et de conserver tout texte entre la déclaration img et l'attribut src.

J'ai utilisé l'outil find + replace (ctrl + h) comme dans l'image: Trouver et remplacer

Diogo Paschoal
la source
8
pour moi, cela fonctionne de manière incohérente - bien que les fourchettes de sélection soient correctes, la sortie reste parfois $1sans remplacement
godblessstrawberry
1
Bonjour, @godblessstrawberry, pouvez-vous partager vos chaînes de recherche et de remplacement?
Diogo Paschoal
2
salut @Diogo J'essayais de remplacer à l'échelle du projet \[innerHtml\]\s*=\s*"'(.*)'\s*\|\s*translate\s*"avec myTranslate="$1"et il sautait des clés au hasard et insérait parfois $ 1 au lieu de la valeur de groupe. la mise à jour 1.28.0 a résolu ce problème
godblessstrawberry
J'ai rencontré le même problème que @godblessstrawberry, faisant un remplacement global sur tous mes fichiers avec l'expression régulière '(et | ou \ + | \ -) ​​\ n (*)' et la chaîne de remplacement '\ n $ 2 $ 1' parfois correctement déplacé l'opérateur binaire au début de la nouvelle ligne mais dans d'autres cas, juste inséré $ 2 $ 1. Apparaîtrait être un bug dans VSCodium
Tom Close
@godblessstrawberry, vérifiez ceci: github.com/microsoft/vscode/issues/81825 . Si cela ne vous concerne pas, fournissez plus d'informations et ouvrez un problème là-bas.
Diogo Paschoal
9

Dans mon cas, 1 $ ne fonctionnait pas, mais 0 $ fonctionne bien pour mon objectif.

Dans ce cas, j'essayais de remplacer les chaînes par le format correct pour les traduire en Laravel, j'espère que cela pourrait être utile à quelqu'un d'autre car il m'a fallu un certain temps pour le trier!

Search: (?<=<div>).*?(?=</div>)
Replace: {{ __('$0') }}

Regex Replace String for Laravel Translation

Ares9323
la source
1
Est-ce possible pour vous de copier votre édition de votre message et de copier le code à la place de l'image? Ce serait mieux pour la visualisation.
Pankwood
3

Pour les débutants, la réponse acceptée est correcte, mais un peu laconique si vous n'êtes pas familier avec VSC ou Regex.

Donc, si c'est votre premier contact avec:

Pour rechercher et modifier du texte,

  1. À l'étape "Rechercher", vous pouvez utiliser l'expression régulière avec des "groupes de capture", par exemple I want to find (group1) and (group2)en utilisant des parenthèses. Cela trouverait le même texte que I want to find group1 and group2, mais avec la différence que vous pouvez ensuite référencer group1et group2à l'étape suivante:

  2. Dans l'étape « Remplacer », vous pouvez vous référer aux groupes de capture par l' intermédiaire $1, $2etc., de sorte que vous pouvez changer la phrase I found $1 and $2 having a picnic, ce qui génèreraitI found group1 and group2 having a picnic.

Remarques:

  • Au lieu d'une simple chaîne, tout ce qui se trouve à l'intérieur ou à l'extérieur de ()peut être une expression régulière.

  • $0 fait référence à l'ensemble du match

Tedskovsky
la source
2

Un autre exemple simple:

Search: style="(.+?)"
Replace: css={css`$1`}

Utile pour convertir HTML en JSX avec emotion / css!

Hedley Smith
la source