Regex VSCode encontrar e substituir matemática de sub-correspondência?


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

Estou usando esse comando regex search and replace no vim para subtrair uma constante de cada ID correspondente.

Eu posso fazer o regex encontrar no VSCode, mas como posso referenciar o submatchpara maths & replace? submatch(1)não funciona no VSCode?

Obrigado.

Respostas:


344

Dada uma expressão regular, (foobar)você pode fazer referência ao primeiro grupo usando $1e assim por diante, se tiver mais grupos no campo de entrada substituir.


perguntou novamente de forma diferente aqui: stackoverflow.com/questions/35283300/…
— Rakka Rage

4
Eu tive que substituir <p>(.*)</p>com <p>\n\t\t\t\t\t\t$1\n\t\t\t\t\t</p>um arquivo linha 2000. Imagine-me fazendo isso manualmente.
— Bishwas Mishra

100

Para aumentar a resposta de Benjamin com um exemplo:

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

Qualquer coisa entre parênteses pode ser uma expressão regular.


Este me lembrou que eu deveria escapar do parêntese se estiver fazendo uma expressão regex no if.
— Clockwork

65

Apenas para adicionar outro exemplo:

Eu estava substituindo src attr nas tags img html, mas precisava substituir apenas o src e manter qualquer texto entre a declaração img e o atributo src.

Eu usei a ferramenta find + replace (ctrl + h) como na imagem: Encontre e substitua


8
para mim isso funciona de forma inconsistente - embora garfos seleção correta, a saída, por vezes, mantém $1sem substituição
— godblessstrawberry

1
Olá, @godblessstrawberry, você pode compartilhar suas cadeias de pesquisa e substituição?
— Diogo Paschoal

2
oi @Diogo Eu estava tentando substituir o projeto \[innerHtml\]\s*=\s*"'(.*)'\s*\|\s*translate\s*"em geral myTranslate="$1"e pulava as chaves aleatoriamente e inseria $ 1 em vez do valor do grupo às vezes. atualização para 1.28.0 resolveu este problema
— godblessstrawberry

Encontrei o mesmo problema que @godblessstrawberry, fazendo uma substituição global em todos os meus arquivos com o regex '(e | ou \ + | \ -) ​​\ n (*)' e a sequência de substituição '\ n $ 2 $ 1' às vezes corretamente mudou o operador binário para o início da nova linha, mas em outros casos apenas inseriu $ 2 $ 1. Parece ser um bug no VSCodium
— Tom Close

@godblessstrawberry, consulte: github.com/microsoft/vscode/issues/81825 . Se não for aplicável, forneça mais informações e abra um problema lá.
— Diogo Paschoal

9

No meu caso, $ 1 não estava funcionando, mas $ 0 funciona bem para o meu propósito.

Nesse caso, eu estava tentando substituir as strings pelo formato correto para traduzi-las no Laravel. Espero que isso possa ser útil para outra pessoa, porque demorei um pouco para resolvê-las!

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

Regex Replace String for Laravel Translation


1
Isso é possível para você editar sua postagem e copiar o código em vez da imagem? Seria melhor para visualização.
— Pankwood

3

Para iniciantes, a resposta aceita está correta, mas um pouco mais concisa se você não conhece o VSC ou o Regex.

Portanto, caso este seja seu primeiro contato com:

Para encontrar e modificar o texto,

  1. Na etapa "Localizar", você pode usar regex com "grupos de captura" I want to find (group1) and (group2), por exemplo , entre parênteses. Isso encontraria o mesmo texto que I want to find group1 and group2, mas com a diferença que você pode fazer referência group1e group2na próxima etapa:

  2. No "Substituir" etapa, você pode consultar os grupos de captura via $1, $2etc, para que você possa alterar a sentença I found $1 and $2 having a picnic, o que faria de saídaI found group1 and group2 having a picnic.

Notas:

  • Em vez de apenas uma string, qualquer coisa dentro ou fora da ()pode ser uma expressão regular.

  • $0 refere-se a toda a partida


2

Outro exemplo simples:

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

Útil para converter HTML para JSX com emoção / css!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.