Usar expressões regulares no Visual Studio
O Visual Studio usa expressões regulares do .NET para localizar e substituir texto.
Sintaxe de expressão regular
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, consulte linguagem de expressão regular.
Propósito | Expressão | 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" |
Corresponder a uma ou mais ocorrências da expressão anterior (corresponder ao máximo de caracteres possível). 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 no "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 |
Corresponda a uma ou mais ocorrências da expressão anterior (corresponda ao menor número possível de caracteres). 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 "carro" somente quando 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 "carro" somente quando ele aparece no final de uma linha |
Ancorar a cadeia de caracteres de correspondência ao final do arquivo | $ | car$ corresponde a "carro" somente quando ele 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" refere-se ao primeiro grupo de expressões "[a-z]". Para saber mais, confira Grupos de captura e padrões de substituição. |
Invalidar uma partida | (?!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". |
Corresponda a qualquer caractere que não esteja em um determinado conjunto de caracteres. Para saber mais, confira 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" |
Corresponder à expressão anterior ou à expressão após o símbolo | | | (sponge|mud) bath combina "banho de esponja" e "banho de lama" |
Escapar o caractere após a barra invertida | \ | \^ corresponde ao caractere ^ |
Especifique o número de ocorrências do caractere ou 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 "xabababx", mas não a "xababababx" |
Corresponder ao texto em uma categoria Unicode. Para obter mais informações sobre classes de caractere Unicode, consulte propriedades de caracteres Unicode Standard 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.) |
\bin corresponde a "in" em "inside", mas não encontra correspondências em "pinto" |
Encontrar a correspondência de uma quebra de linha (isto é, um retorno de carro seguido por uma nova linha, ou somente 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 "Interface Pública" |
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 são visíveis, mas estão presentes no editor e passados para o serviço de expressão regular do .NET. Ao lidar com arquivos da Web ou de um sistema operacional não Windows, lembre-se de considerar 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 define uma subexpressão de uma expressão regular e captura uma subcadeia de caracteres de uma cadeia de caracteres de entrada. Você pode usar grupos capturados dentro da própria expressão regular (por exemplo, para procurar uma palavra repetida) ou em um padrão de substituição. Para obter informações detalhadas, consulte Construções de agrupamento em expressões regulares.
Para criar um grupo de captura numerado, cerque a subexpressão com 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 dos parênteses de abertura na expressão regular. Para acessar o grupo capturado, 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 um e z. A expressão encontra quatro correspondências na seguinte cadeia de caracteres: 1a 2b 3c 4d. A cadeia de caracteres de substituiçãoz$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 numerado automaticamente 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.
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 um nome a ele. A sintaxe de um grupo de captura nomeado é (?<name>subexpression)
.
Grupos de captura nomeados, como grupos de captura numerados, podem ser usados dentro da própria expressão regular 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 denominadorepeated
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 grupo de captura chamado 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.
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 correspondentes nomeadas. Para obter mais informações sobre expressões regulares usadas em padrões de substituição, consulte Substituições em expressões regulares.
Exemplos
Padrão | Descrição |
---|---|
int ([_A-Za-z][_A-Za-z0-9]*) |
Associe definições de inteiros únicos. Os identificadores começam com uma letra maiúscula ou minúscula, seguida por zero ou mais (indicado por * ) letras ou números. Os parênteses externos capturam o identificador como $1 . |
(private|internal|public)*\s*([\w]+\s+)int\s+([_A-Za-z][_A-Za-z0-9]*)\s+=\s+[+-]+(\d)+ |
Corresponda as declarações de inteiros de C# inicializadas com 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+ para 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+(.*)\) |
Encontre a correspondência da linha de abertura de um loop foreach . Os parênteses literais são seguidos por uma barra invertida (\ ). Os vários grupos são capturados como $1 , $2 e $3 pelos parênteses não escapados. |
#define\s+([_A-Za-z][_A-Za-z0-9]*) |
Corresponde às definições de #define (excluindo o valor, se houver). O token definido é armazenado em $1 . |
#include\s+["<](.*)[">] |
A correspondência inclui um arquivo de origem C++. |