Partilhar via


sobre_Expressões_Regulares

Breve descrição

Descreve expressões regulares no PowerShell.

Descrição longa

Observação

Este artigo mostra a sintaxe e os métodos para usar expressões regulares no PowerShell. Não abrange todas as expressões possíveis. Para obter uma referência mais completa, consulte o Regular Expression Language - Quick Reference.

Uma expressão regular é um padrão usado para corresponder ao texto. Ele pode ser composto de caracteres literais, operadores e outras construções. O PowerShell usa o mecanismo de regex do .NET.

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 personagens

Enquanto os literais de caracteres funcionam se você souber o padrão exato, as classes de caracteres permitem que você seja menos específico.

Grupos de personagens

[character group] permite combinar qualquer número de caracteres de uma só vez, enquanto [^character group] apenas combina 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 sua lista de caracteres a corresponder incluir o hífen (-), ele deve estar no início ou no final da lista para o distinguir de uma expressão de intervalo de caracteres.

Intervalos de caracteres

Um padrão também pode ser uma variedade 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 caracteres 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 corresponder a qualquer caractere que não seja uma palavra, use \W.

# This expression returns true.
# The pattern matches the first word character 'B'.
'Book' -match '\w'

Curingas

O ponto (.) é um caractere coringa em expressões regulares. Ele corresponde a qualquer caractere, exceto uma nova linha (\n).

# This expression returns true.
# The pattern matches any 4 characters except the newline.
'a1\ ' -match '....'

Espaço em branco

Você pode combinar qualquer caractere de espaço em branco com a classe de caractere \s. Você pode combinar qualquer caractere que não seja de espaço em branco com \S. Você pode combinar 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.

A seguir estão alguns dos quantificadores disponíveis no PowerShell:

Quantificador Descrição
* Zero ou mais vezes.
+ Uma ou mais vezes.
? Zero ou uma vez.
{n,m} Pelo menos n, mas não mais do que m vezes.

O asterisco (*) corresponde ao elemento anterior zero ou mais vezes. O resultado é que mesmo uma string de entrada sem o elemento ainda assim corresponderia.

# 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 ? corresponde ao elemento anterior zero ou uma vez. Como o asterisco *, ele até corresponde a cadeias de caracteres onde 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 a vírgula , são opcionais.

Quantificador Descrição
{n} Corresponda EXATAMENTE n número de vezes.
{n,} Corresponda pelo menos n vezes.
{n,m} Jogo entre n e m um número específico de 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 das correspondências dentro da cadeia de caracteres de entrada.

As duas âncoras comumente usadas são ^ e $. O símbolo ^ corresponde ao início de uma cadeia de caracteres, e $ao final de uma cadeia de caracteres. As âncoras permitem que você corresponda ao seu texto em uma posição específica, ao mesmo tempo em que descarta caracteres indesejados.

# The pattern expects the string 'fish' to be the only thing on the line.
# This returns FALSE.
'fishing' -match '^fish$'

Observação

Ao definir um regex contendo 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, deve entender a diferença entre as opções de expressão regular Singleline e Multiline.

  • Multiline: O modo Multiline força ^ e $ a corresponder ao início e ao fim de cada LINE, em vez do início e do fim da cadeia de entrada.
  • Singleline: O modo Singleline trata a cadeia de entrada como um Singleline. Ele força o caractere . a corresponder a todos os caracteres (incluindo novas linhas), em vez de corresponder a todos os caracteres EXCETO a nova linha \n.

Para ler mais sobre essas opções e como usá-las, visite o Linguagem de Expressões Regulares - Referência Rápida.

Personagens em fuga

A barra invertida (\) é usada para escapar de caracteres para que eles não sejam analisados pelo mecanismo de expressão regular.

Os seguintes caracteres são reservados: [().\^$|?*+{.

Você precisará escapar desses caracteres nos seus padrões para combiná-los nas suas strings 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 escapar do texto para você.

[regex]::Escape('3.\d{2,}')
3\.\\d\{2,}

Observação

Isso escapa de todos os caracteres de expressão regular reservados, incluindo barras invertidas existentes usadas em classes de caracteres. Certifique-se de usá-lo apenas na parte do seu padrão de que precisa escapar.

Outras fugas de personagens

Pode-se também usar escapes de caracteres reservados para corresponder a tipos de caracteres especiais.

A seguir estão alguns escapes de caracteres comumente usados:

Fuga de Personagens Descrição
\t Corresponde a um separador
\n Corresponde a uma nova linha
\r Corresponde a um retorno de carro

Grupos, capturas e substituições

As construções de agrupamento separam uma cadeia de caracteres de entrada em substrings que podem ser capturadas ou ignoradas. As subcadeias 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 elas.

Uma construção de agrupamento é uma expressão regular entre parênteses. O texto que corresponde à expressão regular incluída é 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 o $MatchesHashtable variável automática para recuperar o texto capturado. O texto que representa todo o jogo é armazenado na chave 0. É importante notar que a hashtable $Matches 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 inteiras , que aumentam da esquerda para a direita. A captura 1 contém todo o texto até ao nome de utilizador, e a captura 2 contém apenas o nome de utilizador.

$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 Integer. 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 nomeadas

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 no $MatchesHashtable variável automática.

Dentro de um grupo de captura, use ?<keyname> para armazenar dados capturados sob 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 Agrupando construções em expressões regulares.

Substituições em expressões regulares

Usar as expressões regulares (regex) com o operador -replace permite que você substitua dinamicamente o texto usando o texto capturado.

<input> -replace <original>, <substitute>

  • <input>: A string 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 correspondências encontradas na cadeia de entrada.

Os operandos <original> e <substitute> estão sujeitos às regras do mecanismo de expressão regular, como fuga de caracteres ou expressões de substituição. O padrão de substituição pode consistir em uma ou mais substituições juntamente 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 - Os 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.com
    
  • Por Nome - Os 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 correspondente.

'Gobble' -replace 'Gobble', '$& $&'
Gobble Gobble

Advertência

Como o caractere $ é usado na expansão de cadeia de caracteres, você precisará usar cadeias de caracteres literais com substituição ou escapar 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 aspas duplas, escape todas as ocorrências de $ para evitar substituições incorretas.

'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

As 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 do about_Comments.

Consulte também