Références arrière RegEx dans IntelliJ

129

Je souhaite utiliser la fonction de recherche et de remplacement d'IntelliJ pour effectuer la transformation suivante:

// Replace this
model.put('foo', 'bar')
// With this
model['foo'] = bar

J'ai essayé ce qui suit:

Texte à rechercher: model.put\((.*),(.*)\) Remplacer par:model\[\\1\] = \\2

Mais Intellij ne semble pas reconnaître \\1et \\2comme des références en arrière. J'ai également essayé une seule barre oblique, mais cela ne fonctionne pas non plus.

Dónal
la source

Réponses:

196

IntelliJ utilise $1pour les références arrière de remplacement .

De l'aide d'IntelliJ:

Pour plus d'informations sur les expressions régulières et leur syntaxe, reportez-vous à la documentation de java.util.regex Les références arrières doivent avoir le format $ n plutôt que \ n.

Steve K
la source
15
On dirait que "\" n'est pas requis: jetbrains.com/idea/help/… . De plus, pour moi, cela ne fonctionne que si j'entoure explicitement mon groupe de "()", sinon je ne peux pas le référencer plus tard. Ex: recherche (foo)remplacer:$1bar
Ghedeon
@Ghedeon: Vous devriez probablement ajouter votre commentaire en tant que réponse ou à la réponse existante. Votre suggestion de mettre l'expression entre () est ce qui a fonctionné pour moi.
mindreader
+1 le peu d'information qui a résolu mon problème connexe: je remplace les wrappers quote-plus autour des variables par des wrappers dollar-curly, c'est- '+ var +'à- dire ${var}dans certaines chaînes de modèle et je n'ai pas pu comprendre pourquoi intellij ne terminerait pas le remplacement. s'avère $doit être échappé dans le remplacement.
worc
13

En bref, vous devez utiliser $1to $npour remplacer les références arrière. \1La syntaxe ne concerne que les références arrière dans la recherche.

Dans IntelliJ 2016, la documentation intégrée à l'application est trompeuse. Voici une meilleure citation de la documentation complète:

Si vous avez besoin de faire référence à la sous-chaîne correspondante quelque part en dehors de l'expression régulière actuelle (par exemple, dans une autre expression régulière comme chaîne de remplacement), vous pouvez la récupérer en utilisant le signe dollar ($ num, où num = 1..n).

Source: syntaxe des expressions régulières 2016.1, trucs et astuces

Barett
la source
2

L'aide contextuelle intégrée au produit pour les expressions régulières dans Idea 9.0 (et peut-être dans d'autres versions) semble incorrecte. Il déclare ceci:

  Références arrière
  \ n
  Quel que soit le nième groupe de capture correspondant

Mais apparemment, comme mentionné dans les réponses précédentes et d'après mon expérience, c'est vraiment \ $ n pour les références antérieures, plutôt que \ n

Vous accédez à cette aide contextuelle en cliquant sur le lien «[Aide]» à côté de l'option radio «Expression régulière» dans la boîte de dialogue «Remplacer le texte»

Glen
la source
0

IntelliJ IDEA / Reference / Regular Expression Syntax Reference


Correspond à la sous-expression et se souvient de la correspondance. Si vous devez utiliser la sous-chaîne correspondante dans la même expression régulière, vous pouvez la récupérer en utilisant la référence arrière (\ num, où num = 1..n). Si vous avez besoin de faire référence à la sous-chaîne correspondante quelque part en dehors de l'expression régulière actuelle (par exemple, dans une autre expression régulière du champ Remplacement), vous pouvez la récupérer en utilisant le signe dollar ($ num, où num = 1..n). Si vous devez inclure les caractères entre parenthèses dans la sous-expression, utilisez "(" ou ")".

Cong De Peng
la source
J'ai trouvé la même chose ici ; cependant, j'ai finalement réussi à utiliser $ 1, sans la barre oblique inverse.
Joe Tricarico