Partilhar via


Usar expressões regulares no Visual Studio

O Visual Studio usa expressões regulares .NET para localizar e substituir texto.

Sintaxe de expressões regulares

A tabela a seguir contém alguns caracteres de expressão regular, operadores, constructos e exemplos de padrão. Para obter uma referência mais completa, confira Linguagem de expressão regular.

Finalidade Expression Exemplo
Encontrar a correspondência de um único caractere (exceto uma quebra de linha). Para saber mais, veja Qualquer caractere. . a.o corresponde a "aro" em "around" e "abo" em "about", mas a não "acro" em "across"
Encontrar a correspondência de zero ou mais ocorrências da expressão anterior (encontrar a correspondência do máximo de caracteres possíveis). Para saber mais, confira Corresponder a zero ou mais vezes. * a*r corresponde a “r” em “rack”, “ar” em “ark” e “aar” em “aardvark”
Corresponder qualquer caractere zero ou mais vezes. .* c.*e corresponde a "cke" em "racket", "comme" em "comment" e "code" em "code"
Encontrar a correspondência de uma ou mais ocorrências da expressão anterior (encontrar a correspondência do máximo de caracteres possíveis). Para saber mais, confira Corresponder a uma ou mais vezes. + e+d corresponde "eed" em "feeder" e "ed" em "faded"
Corresponde qualquer caractere uma ou mais vezes. .+ e.+e corresponde a "eede" em "feeder", mas não encontra correspondências em "feed"
Encontrar a correspondência de zero ou mais ocorrências da expressão anterior (encontrar a correspondência do mínimo de caracteres possíveis). Para saber mais, confira Corresponder a zero ou mais vezes (correspondência lenta). *? \w*?d corresponde a "fad" e "ed" em "faded", mas não à palavra inteira "faded" devido à correspondência lenta
Encontrar a correspondência de uma ou mais ocorrências da expressão anterior (encontrar a correspondência do mínimo de caracteres possíveis). Para saber mais, confira Corresponder a uma ou mais vezes (correspondência lenta). +? e\w+? corresponde a "ee" em "asleep" e a "ed" em "faded", mas não encontra correspondências em "fade"
Ancorar a cadeia de caracteres de correspondência ao início de uma linha ou uma cadeia de caracteres ^ ^car corresponde à palavra "car" somente quando ela aparece no início de uma linha
Ancorar a cadeia de caracteres de correspondência ao final de uma linha \r?$ car\r?$ corresponde a "car" somente quando aparece no final de uma linha
Ancorar a cadeia de caracteres de correspondência ao final do arquivo $ car$ corresponde a "car" somente quando aparece no final do arquivo
Encontrar a correspondência de um único caractere em um conjunto [abc] b[abc] corresponde a "ba", "bb" e "bc"
Encontrar a correspondência de um caractere em um intervalo de caracteres [a-f] be[n-t] corresponde a "bet" em "between", "ben" em "beneath" e "bes" em "beside", mas não encontra correspondências em "below"
Capturar e numerar implicitamente a expressão contida entre parênteses () ([a-z])X\1 corresponde a "aXa" e "bXb", mas não a "aXb". “\1” se refere ao primeiro grupo de expressão “[a-z]”. Para saber mais, confira Grupos de captura e padrões de substituição.
Invalidar uma correspondência (?!abc) real(?!ity) corresponde a "real" em "realty" e "really", mas não em "reality". Também encontra o segundo "real" (mas não o primeiro "real") em "realityreal".
Encontrar a correspondência de qualquer caractere que não está em um conjunto de caracteres específico. Para saber mais, veja Negative Character Group (Grupo de caracteres negativos). [^abc] be[^n-t] corresponde a "bef" em "before", "beh" em "behind" e "bel" em "below", mas não encontra correspondências em "beneath"
Encontrar a correspondência da expressão antes ou depois do símbolo | (sponge|mud) bath corresponde a "sponge bath" e a "mud bath"
Escapar o caractere após a barra invertida \ \^ corresponde ao caractere ^
Especificar o número de ocorrências do caractere ou do grupo anterior. Para saber mais, confira Corresponder a exatamente n vezes. {n}, em que “n” é o número de ocorrências x(ab){2}x corresponde a "xababx"
x(ab){2,3}x corresponde a "xababx" e a "xabababx", mas não a "xababababx"
Corresponder ao texto em uma categoria Unicode. Para saber mais sobre as classes de caracteres Unicode, confira Propriedades de caracteres do Padrão Unicode 15.0. \p{X}, em que "X" é o número Unicode. \p{Lu} corresponde a "T" e "D" em "Thomas Doe"
Encontrar a correspondência de um limite de palavra \b (fora de uma classe de caractere, \b especifica um limite de palavra e, dentro de uma classe de caractere, \b especifica um backspace.) Need source and more context
Corresponder a uma quebra de linha (ou seja, um retorno de carro seguido por uma nova linha ou apenas uma nova linha) \r?\n End\r?\nBegin corresponde a "End" e "Begin" somente quando "End" é a última cadeia de caracteres em uma linha e "Begin" é a primeira cadeia de caracteres na próxima linha
Encontrar a correspondência de qualquer caractere de palavra \w a\wd corresponde a "add" e "a1d", mas não a "a d"
Encontrar a correspondência de um caractere de espaço em branco \s Public\sInterface corresponde à frase "Public Interface"
Encontrar a correspondência de qualquer caractere de dígito decimal \d \d corresponde a "4" e "0" em "wd40"

Um exemplo de expressão regular que combina alguns dos operadores e constructos para corresponder a um número hexadecimal é \b0[xX]([0-9a-fA-F]+)\b. Essa expressão corresponde a "0xc67f", mas não a "0xc67g".

Dica

Em sistemas operacionais Windows, a maioria das linhas termina em “\r\n” (um retorno de carro seguido por uma nova linha). Esses caracteres não ficam visíveis, mas estão presentes no editor e são passados para o serviço de expressão regular do .NET. Ao lidar com arquivos da Web ou de um sistema operacional que não seja Windows, certifique-se de levar em conta a possibilidade de que eles usem uma nova linha apenas para uma quebra de linha.

Grupos de captura e padrões de substituição

Um grupo de captura delineia uma subexpressão de uma expressão regular e captura uma substring de uma cadeia de caracteres de entrada. Você pode usar os grupos capturados na expressão regular em si (por exemplo, para procurar uma palavra repetida) ou em um padrão de substituição. Para obter informações detalhadas, confira Constructos de agrupamento em expressões regulares.

Para criar um grupo de captura numerado, coloque a subexpressão entre parênteses no padrão de expressão regular. As capturas são numeradas automaticamente, da esquerda para a direita, com base na posição do parêntese de abertura na expressão regular. Para acessar o grupo de captura, considere os seguintes exemplos:

  • Dentro da expressão regular: use \number. Por exemplo, \1 na expressão regular (\w+)\s\1 faz referência ao primeiro grupo de captura (\w+).

  • Em um padrão de substituição: use $number. Por exemplo, a expressão regular agrupada (\d)([a-z]) define dois grupos: o primeiro grupo contém um único dígito decimal e o segundo grupo contém um único caractere entre a e z. A expressão localiza quatro correspondências na cadeia de caracteres a seguir: 1a 2b 3c 4d. A cadeia de caracteres de substituição z$1 faz referência somente ao primeiro grupo ($1) e converte a cadeia de caracteres em z1 z2 z3 z4.

A imagem a seguir mostra uma expressão regular (\w+)\s\1 e uma cadeia de caracteres de substituição $1. A expressão regular e o padrão de substituição fazem referência ao primeiro grupo de captura que é automaticamente numerado como 1. Quando você escolhe Substituir tudo na caixa de diálogo Substituição Rápida no Visual Studio, palavras repetidas são removidas do texto.

Captura de tela da Substituição Rápida mostrando um grupo de captura numerado no Visual Studio.

Dica

Na caixa de diálogo Substituição Rápida, selecione o botão Usar Expressões Regulares ou pressione Alt+E.

Grupos de captura nomeados

Em vez de depender da numeração automática de um grupo de captura, você pode dar a ele um nome. A sintaxe para um grupo de captura nomeado é (?<name>subexpression).

Os grupos de captura nomeados, como grupos de captura numerados, podem ser usados na expressão regular em si ou em um padrão de substituição. Para acessar o grupo de captura nomeado, considere os seguintes exemplos:

  • Dentro da expressão regular: use \k<name>. Por exemplo, \k<repeated> na expressão regular (?<repeated>\w+)\s\k<repeated> faz referência ao grupo de captura chamado repeated e cuja subexpressão é \w+.

  • Em um padrão de substituição: use ${name}. Por exemplo, ${repeated}.

A imagem a seguir mostra uma expressão regular (?<repeated>\w+)\s\k<repeated> e uma cadeia de caracteres de substituição ${repeated}. A expressão regular e o padrão de substituição fazem referência ao primeiro grupo de captura nomeado repeated. Quando você escolhe Substituir tudo na caixa de diálogo Substituição Rápida no Visual Studio, palavras repetidas são removidas do texto.

Captura de tela da Substituição Rápida mostrando um grupo de captura nomeado no Visual Studio.

Dica

Selecione o botão Usar Expressões Regulares (ou pressione Alt+E) na caixa de diálogo Substituição Rápida.

Para saber mais sobre grupos de captura nomeados, confira Subexpressões coincidentes nomeadas. Para saber mais sobre expressões regulares usadas em padrões de substituição, confira Substituições em expressões regulares.

Exemplos

Padrão Descrição
int ([_A-Za-z][_A-Za-z0-9]*) Corresponde a definições de inteiro único. Os identificadores começam com uma letra maiúscula ou minúscula, seguida por zero ou mais (indicado por *) letras ou números. O identificador é capturado como $1 pelos parênteses externos.
(private|internal|public)*\s*([\w]+\s+)int\s+([_A-Za-z][_A-Za-z0-9]*)\s+=\s+[+-]+(\d)+ Corresponda a declarações inteiras C# inicializadas em literais inteiros, capturando as várias partes, incluindo o nível de acesso, modificadores como const ou static, o identificador e o valor definido. Observe o uso de \s+ pelo menos um caractere de espaço em branco ou \s* se o espaço em branco pode ou não ocorrer.
foreach\s*\(([\w\d]*)\s+([\w\d]*)\s+in\s+(.*)\) Combine a linha de abertura de um loop foreach. Os parênteses literais escapam com barra invertida (\). Os vários grupos são capturados como $1, $2, e $3 pelos parênteses sem escape.
#define\s+([_A-Za-z][_A-Za-z0-9]*) Corresponde às definições #define (sem o valor, se houver). O token definido é armazenado no $1.
#include\s+["<](.*)[">] A correspondência inclui em um arquivo de origem C++.