Referências retroativas RegEx no IntelliJ

129

Desejo usar o recurso de localização e substituição do IntelliJ para executar a seguinte transformação:

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

Eu tentei o seguinte:

Texto a encontrar: model.put\((.*),(.*)\) Substitua por:model\[\\1\] = \\2

Mas o Intellij não parece reconhecer \\1e \\2ser referência. Eu também tentei uma barra, mas isso também não funciona.

Dónal
fonte

Respostas:

196

O IntelliJ usa $1para referências de substituição .

Da ajuda do IntelliJ:

Para obter mais informações sobre expressões regulares e sua sintaxe, consulte a documentação do java.util.regex. As referências anteriores devem ter $ n, em vez do formato \ n.

Steve K
fonte
15
Parece que "\" não é necessário: jetbrains.com/idea/help/… . Além disso, para mim, funciona apenas se eu cercar explicitamente meu grupo com "()", caso contrário, não posso fazer referência a ele mais tarde. Ex: pesquisar (foo)substituir:$1bar
Ghedeon 17/11/2015
@Ghedeon: Você provavelmente deve adicionar seu comentário como resposta ou à resposta existente. Sua sugestão para colocar a expressão em () é o que funcionou para mim.
LeitorMental
+1 o bit de informação que resolveu o meu problema relacionado: eu estou substituindo quote-plus wrappers em torno de variáveis com invólucros dólar-encaracolados, ou seja, '+ var +'para ${var}em algumas cordas modelo e não conseguia descobrir por que intellij não iria terminar a substituição. Acontece que $precisa ser escapado na substituição.
WORC
13

Em suma, você deve usar $1para $npara referências de substituição posteriores. \1sintaxe é apenas para referências anteriores na pesquisa.

No IntelliJ 2016, a documentação no aplicativo é enganosa. Aqui está uma citação melhor dos documentos completos:

Se você precisar consultar a substring correspondente em algum lugar fora da expressão regular atual (por exemplo, em outra expressão regular como uma sequência de substituição), poderá recuperá-la usando o cifrão ($ num, onde num = 1..n).

Fonte: sintaxe para expressões regulares de 2016.1, Dicas e truques

Barett
fonte
2

A ajuda contextual no produto para regex no Idea 9.0 (e talvez em outras versões) parece estar incorreta. Ele afirma o seguinte:

  Referências anteriores
  \ n
  Qualquer que seja o n º grupo de captura que corresponda

Mas, aparentemente, como mencionado nas respostas anteriores e é minha experiência, é realmente \ $ n para referências anteriores, em vez de \ n

Você obtém essa ajuda contextual clicando no link '[Ajuda]' ao lado da opção de rádio "Expressão regular" na caixa de diálogo "Substituir texto"

Glen
fonte
0

IntelliJ IDEA / Referência / Referência de sintaxe de expressão regular


Corresponde à subexpressão e lembra a correspondência. Se você precisar usar a substring correspondente na mesma expressão regular, poderá recuperá-la usando a referência anterior (\ num, onde num = 1..n). Se precisar referenciar a substring correspondente em algum lugar fora da expressão regular atual (por exemplo, em outra expressão regular no campo Substituição), você pode recuperá-la usando o sinal de dólar ($ num, onde num = 1..n). Se você precisar incluir os caracteres entre parênteses na subexpressão, use "(" ou ")".

Cong De Peng
fonte
Eu encontrei a mesma coisa aqui ; no entanto, tive sucesso usando US $ 1, sem a barra invertida.
Joe Tricarico