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.