Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Descrição curta
Descreve expressões regulares no PowerShell.
Descrição longa
Nota
Este artigo mostra a sintaxe e os métodos para usar expressões regulares no PowerShell. Ele não abrange todas as expressões possíveis. Para uma referência mais completa, consulte a Referência Rápida da Linguagem de Expressão Regular .
Uma expressão regular é um padrão usado para corresponder ao texto. Ele pode ser composto por caracteres literais, operadores e outras construções. O PowerShell usa o mecanismo .NET Regex.
Este artigo demonstra a sintaxe de expressão regular no PowerShell. O PowerShell tem vários operadores e cmdlets que usam expressões regulares. Você pode ler mais sobre sua sintaxe e uso nos links abaixo.
As expressões regulares do PowerShell não diferenciam maiúsculas de minúsculas por padrão. Cada método mostrado acima tem uma forma diferente de forçar a diferenciação entre maiúsculas e minúsculas.
- Para
Select-String, use o parâmetro CaseSensitive. - Para operadores que usam expressões regulares, use a versão que diferencia maiúsculas de minúsculas:
-cmatch,-creplaceou-csplit - Para a instrução
switch, use a opção-CaseSensitive
Literais de caracteres
Uma expressão regular pode ser um caractere literal ou uma cadeia de caracteres. A expressão faz com que o mecanismo corresponda exatamente ao texto especificado.
# This statement returns true because book contains the string "oo"
'book' -match 'oo'
Classes de caracteres
Embora os literais de caracteres funcionem se você souber o padrão exato, as classes de caracteres permitem que você seja menos específico.
Grupos de caracteres
[character group] permite que você corresponda a qualquer número de caracteres de uma só vez, enquanto [^character group] corresponde apenas a caracteres que NÃO estão no grupo.
# This expression returns true if the pattern matches big, bog, or bug.
'big' -match 'b[iou]g'
Se a lista de caracteres a serem correspondentes incluir o caractere hífen (-), ele deverá estar no início ou no final da lista para distingui-lo de uma expressão de intervalo de caracteres.
Intervalos de caracteres
Um padrão também pode ser um intervalo de caracteres. Os caracteres podem ser [A-Z]alfabéticos, [0-9]numéricos ou até mesmo [ -~] baseados em ASCII (todos os caracteres imprimíveis).
# This expression returns true if the pattern matches any 2 digit number.
42 -match '[0-9][0-9]'
Números
A \d classe de caractere corresponde a qualquer dígito decimal. Por outro lado, \D corresponde a qualquer caractere, exceto dígitos decimais.
# This expression returns true if it matches a server name.
# (Server-01 - Server-99).
'Server-01' -match 'Server-\d\d'
Caracteres do Word
A classe de caractere \w corresponde a qualquer caractere de palavra [a-zA-Z_0-9]. Para fazer a correspondência com qualquer caractere não verbal, use \W.
# This expression returns true.
# The pattern matches the first word character 'B'.
'Book' -match '\w'
Curingas
O período (.) é um caractere curinga em expressões regulares. Ele faz correspondência com qualquer caractere, exceto o caractere de nova linha (\n).
# This expression returns true.
# The pattern matches any 4 characters except the newline.
'a1\ ' -match '....'
Espaço em branco
Você pode fazer a correspondência de qualquer caractere de espaço em branco com a classe de caracteres \s. Você pode combinar qualquer caractere que não seja espaço em branco com \S. Você pode fazer a correspondência de caracteres de espaço literal com .
# This expression returns true.
# The pattern uses the whitespace character class to match the leading
# space and a literal space to matching the trailing space.
' - ' -match '\s- '
Quantificadores
Os quantificadores controlam quantas instâncias de cada elemento devem estar presentes na cadeia de caracteres de entrada.
Veja a seguir alguns dos quantificadores disponíveis no PowerShell:
| Quantificador | Descrição |
|---|---|
* |
Zero ou mais vezes. |
+ |
Uma ou mais vezes. |
? |
Zero ou uma vez. |
{n,m} |
No mínimo n, mas não mais do que m vezes. |
O asterisco (*) corresponde ao elemento anterior zero ou mais vezes. O resultado é que até mesmo uma cadeia de caracteres de entrada sem o elemento seria uma correspondência.
# This returns true for all account name strings even if the name is absent.
'ACCOUNT NAME: Administrator' -match 'ACCOUNT NAME:\s*\w*'
O sinal de adição (+) corresponde ao elemento anterior uma ou mais vezes.
# This returns true if it matches any server name.
'DC-01' -match '[A-Z]+-\d\d'
O ponto de interrogação ? faz correspondência com o elemento anterior zero ou uma única vez. Como o asterisco *, ele corresponde até mesmo a cadeias de caracteres em que o elemento está ausente.
# This returns true for any server name, even server names without dashes.
'SERVER01' -match '[A-Z]+-?\d\d'
O quantificador {n, m} pode ser usado de várias maneiras diferentes para permitir o controle granular sobre o quantificador. O segundo elemento m e o , de vírgula são opcionais.
| Quantificador | Descrição |
|---|---|
{n} |
Faz correspondência EXATAMENTE n vezes. |
{n,} |
Faz correspondência NO MÍNIMO n vezes. |
{n,m} |
Faz correspondência entre n e m vezes. |
# This returns true if it matches any phone number.
'111-222-3333' -match '\d{3}-\d{3}-\d{4}'
Âncoras
As âncoras permitem que você faça com que uma correspondência seja bem-sucedida ou falhe com base na posição de correspondência dentro da cadeia de caracteres de entrada.
As duas âncoras comumente usadas são ^ e $. O sinal de interpolação ^ está correlacionado ao início de uma cadeia de caracteres e a $ que faz correspondência com o final de uma cadeia de caracteres. As âncoras permitem que você faça a correspondência com o texto em uma posição específica, descartando também caracteres indesejados.
# The pattern expects the string 'fish' to be the only thing on the line.
# This returns FALSE.
'fishing' -match '^fish$'
Nota
Ao definir um regex que contém uma âncora ($), você deve colocar o regex entre aspas simples ('). Se você usar aspas duplas ("), o PowerShell interpretará a cadeia de caracteres como uma expressão de variável expansível.
Ao usar âncoras no PowerShell, você deve entender a diferença entre as opções de expressão regular Singleline e Multiline.
-
Multilinha: o modo multilinha força
^e$a fazerem correspondência com o início e ao fim de cada LINHA em vez do início e do fim da cadeia de caracteres de entrada. -
Singleline: o modo Singleline trata a cadeia de caracteres de entrada como SingleLine.
Ele força o caractere
.a fazer correspondência com cada caractere (incluindo linhas novas), em vez de corresponder-se a cada caractere EXCETO a linha nova\n.
Para ler mais sobre essas opções e como usá-las, acesse Linguagem de expressões regulares - Referência rápida.
Caracteres de escape
A barra invertida (\) é usada para fazer o escape de caracteres para que eles não sejam analisados pelo mecanismo de expressão regular.
Os seguintes caracteres são reservados: [().\^$|?*+{.
Você precisará fazer o escape desses caracteres em seus padrões para fazer a correspondência com eles em suas cadeias de caracteres de entrada.
# This returns true and matches numbers with at least 2 digits of precision.
# The decimal point is escaped using the backslash.
'3.141' -match '3\.\d{2,}'
Há um método estático da classe regex que pode fazer o escape do texto para você.
[regex]::Escape('3.\d{2,}')
3\.\\d\{2,}
Nota
Isso faz o escape de todos os caracteres de expressão regular reservados, incluindo as barras invertidas existentes usadas nas classes de caracteres. Certifique-se de usá-la apenas na parte do seu padrão que você precisa escapar.
Outras formas de escape de caracteres
Também há escapes de caracteres reservados que você pode usar para fazer a correspondência com os tipos de caracteres especiais.
Veja a seguir algumas formas de escapes de caracteres comumente usadas:
| Escape de caractere | Descrição |
|---|---|
\t |
Faz correspondência com a uma tabulação |
\n |
Faz correspondência com uma linha nova |
\r |
Faz correspondência com um retorno de carro |
Grupos, capturas e substituições
Os constructos de agrupamento separam uma cadeia de caracteres de entrada em subcadeias de caracteres que podem ser capturadas ou ignoradas. As subcadeias de caracteres agrupadas são chamadas de subexpressões. Por padrão, as subexpressões são capturadas em grupos numerados, embora você também possa atribuir nomes a eles.
Uma construção de agrupamento é uma expressão regular cercada por parênteses. Qualquer texto que faça correspondência com a expressão regular delimitada é capturado. O exemplo a seguir divide o texto de entrada em dois grupos de captura.
'The last logged on user was CONTOSO\jsmith' -match '(.+was )(.+)'
True
Use a variável $MatchesHashtable automática para recuperar o texto capturado.
O texto que representa a correspondência inteira é armazenado na chave 0. É importante observar que o $Matches hashtable contém apenas a primeira ocorrência de qualquer padrão correspondente.
$Matches.0
The last logged on user was CONTOSO\jsmith
As capturas são armazenadas em chaves numéricas de número inteiro que aumentam da esquerda para a direita. A captura 1 contém todo o texto até o nome de usuário, e a captura 2 contém apenas o nome de usuário.
$Matches
Name Value
---- -----
2 CONTOSO\jsmith
1 The last logged on user was
0 The last logged on user was CONTOSO\jsmith
Importante
A chave 0 é um número inteiro. Você pode usar qualquer método Hashtable para acessar o valor armazenado.
PS> 'Good Dog' -match 'Dog'
True
PS> $Matches[0]
Dog
PS> $Matches.Item(0)
Dog
PS> $Matches.0
Dog
Capturas indicadas
Por padrão, as capturas são armazenadas em ordem numérica crescente, da esquerda para a direita.
Você também pode atribuir um nome a um grupo de captura. Esse nome se torna uma chave na variável automática $MatchesHashtable.
Dentro de um grupo de captura, use ?<keyname> para armazenar dados capturados em uma chave nomeada.
PS> $string = 'The last logged on user was CONTOSO\jsmith'
PS> $string -match 'was (?<domain>.+)\\(?<user>.+)'
True
PS> $Matches
Name Value
---- -----
domain CONTOSO
user jsmith
0 was CONTOSO\jsmith
PS> $Matches.domain
CONTOSO
PS> $Matches.user
jsmith
O exemplo a seguir armazena a entrada de log mais recente no Log de Segurança do Windows. A expressão regular fornecida extrai o nome de usuário e o domínio da mensagem e os armazena sob as chaves:N para nome e D para domínio.
$log = (Get-WinEvent -LogName Security -MaxEvents 1).Message
$r = '(?s).*Account Name:\s*(?<N>.*).*Account Domain:\s*(?<D>[A-Z,0-9]*)'
$log -match $r
True
$Matches
Name Value
---- -----
D CONTOSO
N jsmith
0 A process has exited...
Para obter mais informações, consulte Constructos de agrupamento em expressões regulares.
Substituições em expressões regulares
Usar as expressões regulares (regex) com o operador -replace permite substituir dinamicamente o texto usando texto capturado.
<input> -replace <original>, <substitute>
-
<input>: a cadeia de caracteres a ser pesquisada -
<original>: uma expressão regular usada para pesquisar a cadeia de caracteres de entrada -
<substitute>: uma expressão de substituição regex para substituir as correspondências encontradas na cadeia de caracteres de entrada.
Os operandos <original> e <substitute> estão sujeitos a regras do mecanismo de expressão regular, como expressões de escape ou substituição de caracteres. O padrão de substituição pode consistir em uma ou mais substituições junto com caracteres literais.
Os grupos de captura podem ser referenciados na cadeia de caracteres <substitute> usando o caractere $ antes do identificador de grupo.
Duas maneiras de fazer referência a grupos de captura são por Número e por Nome.
Por Número – Grupos de captura são numerados da esquerda para a direita.
'John D. Smith' -replace '(\w+) (\w+)\. (\w+)', '$1.$2.$3@contoso.com'John.D.Smith@contoso.comPor Nome – Grupos de captura também podem ser referenciados pelo nome.
'CONTOSO\Administrator' -replace '\w+\\(?<user>\w+)', 'FABRIKAM\${user}'FABRIKAM\Administrator
A expressão $& representa todo o texto com que faz correspondência.
'Gobble' -replace 'Gobble', '$& $&'
Gobble Gobble
Aviso
Como o caractere $ é usado na expansão da cadeia de caracteres, você precisará usar as cadeias de caracteres literais com a substituição ou o escape do caractere $ ao usar aspas duplas.
'Hello World' -replace '(\w+) \w+', '$1 Universe'
"Hello World" -replace "(\w+) \w+", "`$1 Universe"
Hello Universe
Hello Universe
Além disso, se você quiser ter o $ como um caractere literal, use $$ em vez dos caracteres de escape normais. Ao usar as aspas duplas, faça o escape de todas as ocorrências de $ para evitar a substituição incorreta.
'5.72' -replace '(.+)', '$$$1'
"5.72" -replace "(.+)", "`$`$`$1"
$5.72
$5.72
Para obter informações detalhadas sobre expressões de substituição, consulte Substituições em Expressões Regulares.
Comentários em expressões regulares
Expressões regulares podem ser muito complexas e difíceis de ler. Você pode usar comentários para torná-los mais compreensíveis. Há dois tipos de comentários permitidos em expressões regulares.
- Comentário embutido (
(?#)) - Comentário de fim de linha (
#)
Para obter mais informações, consulte a seção Comentários de expressão regular em about_Comments.