Dicas para usar regex avançado em buscas e refatorações no VSCode

1. Fundamentos do Regex no VSCode

1.1 Ativando o modo regex na busca e substituição

O VSCode oferece suporte nativo a expressões regulares no painel de busca (Ctrl+F para busca local, Ctrl+Shift+F para busca global). Para ativar o modo regex, clique no ícone .* ao lado do campo de busca ou pressione Alt+R. A substituição é ativada pressionando Ctrl+H (local) ou expandindo o painel de busca global.

Exemplo de busca simples com regex:

Buscar: \d{3}-\d{3}-\d{4}
Substituir: ($1) $2-$3

1.2 Diferenças entre regex padrão e o engine ECMAScript do VSCode

O VSCode utiliza o engine ECMAScript (JavaScript) para regex. Isso significa que recursos como lookbehind positivo ((?<=...)) e negativo ((?<!...)) são suportados, mas com limitações: não é possível usar quantificadores variáveis dentro de lookbehinds. Além disso, o VSCode não suporta \K (reset de match) ou \G (âncora de posição anterior).

1.3 Flags essenciais

As flags são inseridas no final do padrão regex dentro do campo de busca:

  • g (global): encontra todas as ocorrências, não apenas a primeira
  • i (case-insensitive): ignora diferenças entre maiúsculas e minúsculas
  • m (multiline): faz com que ^ e $ correspondam ao início/fim de cada linha

Exemplo prático:

Buscar: ^\s*\/\/.*$       # encontra linhas de comentário
Flag: gm                  # global e multiline

2. Grupos de Captura e Substituição Inteligente

2.1 Usando parênteses para captura e referência

Os grupos de captura são definidos com parênteses () e referenciados na substituição com $1, $2, etc.

Buscar: (\w+)@(\w+)\.(\w+)
Substituir: $1 [arroba] $2 [ponto] $3

2.2 Grupos nomeados

Grupos nomeados permitem referências mais legíveis:

Buscar: (?<nome>\w+)@(?<dominio>\w+)\.(?<tld>\w+)
Substituir: ${nome} [arroba] ${dominio} [ponto] ${tld}

2.3 Substituição condicional com lookahead/lookbehind

Use lookahead para garantir contexto sem capturar:

Buscar: (\w+)(?=\s*=\s*null)
Substituir: $1 ?? 'valor_padrao'

Isso substitui apenas variáveis seguidas por = null, sem consumir o espaço ou o null.

3. Lookahead e Lookbehind para Buscas Contextuais

3.1 Lookahead positivo e negativo

Lookahead positivo ((?=...)) verifica se algo vem depois; negativo ((?!...)) verifica se algo NÃO vem depois.

Buscar: \b\w+\b(?=\s*=\s*function)  # encontra nomes de funções

3.2 Lookbehind positivo e negativo

Lookbehind positivo ((?<=...)) verifica se algo vem antes; negativo ((?<!...)) verifica se algo NÃO vem antes.

Buscar: (?<!\$)\b\d+\b  # encontra números que NÃO estão precedidos por $

3.3 Exemplos práticos

Encontrar imports sem uso:

Buscar: import\s+(\w+)\s+from\s+['"].*?['"];(?![\s\S]*?\b\1\b)

Encontrar variáveis não inicializadas:

Buscar: ^\s*(let|const|var)\s+(\w+)\s*;(?![^;]*=)

4. Refatoração de Código com Regex e Multi-Cursor

4.1 Combinando regex com multi-cursor

Após uma busca regex, pressione Ctrl+Shift+L para selecionar todas as ocorrências encontradas. Use multi-cursor para editar simultaneamente.

Buscar: \bconsole\.log\(.*?\);?

Selecione todas e pressione Delete para remover todos os logs de debug de uma vez.

4.2 Refatoração de nomes com padrões complexos

Para renomear variáveis que seguem um padrão específico:

Buscar: \b_oldPrefix(\w+)\b
Substituir: newPrefix$1

4.3 Remoção de comentários e linhas duplicadas

Remover comentários de linha única:

Buscar: ^\s*\/\/.*$\n?
Substituir: (vazio)

Remover linhas duplicadas consecutivas:

Buscar: ^(.+)$\n^\1$
Substituir: $1

5. Padrões Avançados para Busca em Arquivos e Pastas

5.1 Uso de âncoras e classes de caracteres

Âncoras e classes são essenciais para buscas precisas em projetos grandes:

Buscar: ^\s*(public|private|protected)\s+\w+\s+\w+\s*\(  # encontra métodos

Classes de caracteres:

Buscar: \b[A-Z][a-z]+\b  # encontra palavras iniciadas com maiúscula (possíveis classes)

5.2 Quantificadores não-gulosos

Use *?, +?, ?? para evitar capturas excessivas:

Buscar: <div[^>]*>.*?</div>  # guloso: captura até a última div
Buscar: <div[^>]*>.*?</div>  # não-guloso: captura até a primeira </div>

5.3 Filtros de arquivos e pastas

No painel de busca global, use o campo "files to include" e "files to exclude":

Incluir: src/**/*.js, src/**/*.ts
Excluir: node_modules, dist, *.test.js

Exemplo de busca filtrada:

Buscar: \brequire\(['"].*?['"]\)  
Incluir: src/**/*.js
Excluir: node_modules

6. Expressões Regulares para Migração de Código

6.1 Substituição de var para let/const

Buscar: \bvar\s+(\w+)\s*=\s*(['"`]|true|false|null|\d+)
Substituir: const $1 = $2

Para variáveis que podem ser reatribuídas:

Buscar: \bvar\s+(\w+)\s*=\s*(?!['"`]|true|false|null|\d+)
Substituir: let $1 = 

6.2 Conversão de chamadas de API obsoletas

Buscar: \b\.success\((\w+)\)
Substituir: .then($1)

6.3 Normalização de formatação de datas

Buscar: (\d{2})/(\d{2})/(\d{4})
Substituir: $3-$2-$1  # converte DD/MM/AAAA para AAAA-MM-DD

7. Boas Práticas e Armadilhas Comuns

7.1 Testando regex com preview

Sempre use o preview do VSCode (pressione Ctrl+Enter no campo de busca) para visualizar todas as ocorrências antes de aplicar a substituição. O preview destaca cada match e mostra o resultado da substituição.

7.2 Evitando regex muito complexos

Regex excessivamente complexos são difíceis de manter e propensos a erros. Para padrões muito elaborados, use ferramentas como Regex101 ou RegExr para testar e depurar. Considere também usar extensões como "Regex Previewer" para testar dentro do próprio VSCode.

7.3 Salvando regex frequentes como snippets

Crie snippets personalizados no VSCode para regex que você usa com frequência:

Arquivo: snippets.code-snippets
Conteúdo:
{
  "Remover console.log": {
    "prefix": "rcl",
    "body": "\\bconsole\\.log\\(.*?\\);?",
    "description": "Regex para encontrar console.log"
  }
}

Você também pode usar extensões como "Find and Transform" para criar buscas regex reutilizáveis com atalhos de teclado.


Referências