Qual o sabor do Regex que o Visual Studio Code usa?

130

Tentando pesquisar e substituir no Código do Visual Studio, acho que seu sabor Regex é diferente do Visual Studio completo. Especificamente, tento declarar um grupo nomeado com o string (?<p>[\w]+)qual funciona no Visual Studio, mas não no Visual Studio Code. Ele vai reclamar com o erro Invalid group.

Além de resolver esse problema específico, estou procurando informações sobre o sabor dos Regexes no Visual Studio Code e onde encontrar documentação sobre ele, para que eu possa me ajudar com quaisquer outras perguntas que possam surgir.

O Visual Studio completo usa expressões regulares do .NET, conforme documentado aqui . Este link é mencionado como a documentação para o VS Code em outro lugar no Stackoverflow, mas não é.

Eric
fonte
O VSCode está usando o mecanismo de expressão regular baseado em JavaScript, mas não é o mesmo. Você não pode usar grupos de captura nomeados lá.
Wiktor Stribiżew
1
Não há documentação específica sobre o regex usado no VSCode. No entanto, se você der uma olhada no código-fonte , verá muitos códigos JS por aí. Se você tentar usar lookbehinds, receberá um erro de padrão inválido, enquanto os lookaheads funcionam. E o sabor de regex JS é o único mecanismo de regex que trata o [^]padrão como correspondendo a qualquer símbolo. Portanto, é claro que é o mecanismo JS regex.
Wiktor Stribiżew
5
O padrão é ECMAScript 5 .
Wiktor Stribiżew
1
ESTÁ BEM. Bem, se você tem certeza e tem alguns links para documentos, pode responder. Eu vou votar. Não pense que a especificação do ECMAScript é um ótimo link, se for o único.
Eric
1
Então, que tipo de resposta você espera? Tudo o que eu postei acima + link para a descrição da sintaxe JS regex? Como referência MDN ?
Wiktor Stribiżew

Respostas:

170

Rust Regex na barra lateral Localizar / substituir em arquivos

Rob Lourens, da MSFT, escreveu que a pesquisa de arquivos usa o Rex regex. A documentação do idioma Rust descreve a sintaxe.

Rob Lourens no GitHub

Regex JavaScript no widget Localizar / substituir no arquivo

Alexandru Dima, da MSFT, escreveu que o widget find usa regex JavaScript. Como Wicktor comentou, a documentação do ECMAScript 5 descreve a sintaxe. O mesmo acontece com o MDN JavaScript Regular Expression Guide .

Alexandru Dima no GitHub

Teste a diferença

A localização na barra lateral de arquivos não suporta, (?=foobar)enquanto a localização no widget de arquivo suporta essa sintaxe à procura da cabeça.

Mostra uma cabeça de impressão trabalhando no widget, mas não na barra lateral.

Sobre Localizar / Substituir por Grupos

Para localizar / substituir com grupos, uso de parênteses ()para agrupar e $1, $2, $3, $npara substituir.

Aqui está um exemplo.

Antes:

Este é o texto antes da substituição.

Depois de:

Este é o texto após a substituição.

Shaun Luttin
fonte
12

A resposta de Shaun ainda está correta, no entanto, para adicionar uma atualização, recentemente o VS Code adicionou a opção de optar pelo uso do mecanismo PCRE2 baseado em Perl . Você pode habilitar isso através da sua configuração.

Isso permite que você execute operações regex mais avançadas, como lookaheads e backreferences . Mas, como observado abaixo, o regex ainda precisa ser um regex JavaScript válido .

O VS Code suporta pesquisas de expressão regular, no entanto, referências anteriores e lookaround não são suportadas por padrão. Mas você pode habilitá-los com a configuração search.usePCRE2 . Isso configura o ripgrep para usar o mecanismo de regex PCRE2. Embora o PCRE2 ofereça suporte a muitos outros recursos, apenas suportamos expressões regex que ainda são válidas em JavaScript , porque os editores abertos ainda são pesquisados ​​usando a pesquisa baseada em JavaScript do editor.

E para um bônus, se você acabou aqui tentando fazer pesquisas em várias linhas, o VS Code recentemente adicionou esse recurso também !

insira a descrição da imagem aqui

protoEvangelion
fonte
PCRE2 pode ser ativado no menu de configurações. Vá para Preferências ~ Configurações e procure por 'regex'
DougR 21/04/19
Parece que essa configuração foi descontinuada e o PCRE2 é usado automaticamente como fallback quando o mecanismo padrão não suporta um recurso.
Kevin Rak