about_Regular_Expressions

Descrição breve

Descreve expressões regulares no PowerShell.

Descrição longa

Observação

Este artigo mostrará a sintaxe e os métodos para usar expressões regulares no PowerShell, nem toda a sintaxe é discutida. Para obter uma referência mais completa, consulte 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.

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 maneira diferente de forçar a diferenciação de 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 switch instrução, use a -casesensitive opção

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

Enquanto literais de caracteres funcionam 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 uma vez, enquanto [^character group] apenas corresponde caracteres NÃ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 correspondidos incluir o caractere de 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 alfabéticos [A-Z], numéricos [0-9]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 corresponderá a qualquer dígito decimal. Por outro lado, \D corresponderá a qualquer dígito não decimal.

# This expression returns true if it matches a server name.
# (Server-01 - Server-99).
'Server-01' -match 'Server-\d\d'

Caracteres do Word

A \w classe de caractere corresponderá a qualquer caractere [a-zA-Z_0-9]de palavra. Para corresponder a qualquer caractere que não seja de palavra, use \W.

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

Curingas

O ponto (.) é um caractere curinga em expressões regulares. Ele corresponderá 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 \s caractere. Você pode combinar qualquer caractere que não seja de espaço em branco com \So . 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 cadeia 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 ? corresponde ao elemento anterior zero ou uma vez. Como o asterisco *, ele até mesmo corresponderá 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 {n, m} quantificador 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 ao número de vezes.
{n,} Corresponda pelo menos um n número de vezes.
{n,m} Correspondência entre n e m número 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 cursor ^ corresponde ao início de uma cadeia de caracteres e $, que corresponde ao final de uma cadeia de caracteres. As âncoras permitem que você corresponda 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, certifique-se de colocar o regex entre aspas simples (') em vez de aspas duplas (") ou o PowerShell expandirá a expressão como uma variável.

Ao usar âncoras no PowerShell, você deve entender a diferença entre as opções de expressão regular Linha Única e Multilinha .

  • Multilinha: forças ^ do modo Multilinha e $ para corresponder ao início de cada LINHA em vez do início e fim da cadeia de entrada.
  • Linha única: o modo de linha única trata a cadeia de caracteres de entrada como uma SingleLine. Ele força o . personagem 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 a Linguagem de Expressão Regular - Referência Rápida.

Caracteres de escape

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 em seus padrões para correspondê-los 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 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 que você precisa escapar.

Outros personagens escapam

Há também escapes de caracteres reservados que você pode usar 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 uma guia
\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 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 elas.

Uma construção de agrupamento é uma expressão regular cercada por parênteses. Qualquer texto correspondente à 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 a variável automática Hashtable para recuperar o $Matchestexto capturado. O texto que representa toda a correspondência é armazenado na chave 0. É importante observar que a $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 inteiras numéricas que aumentam da esquerda para a direita. Capture 1 contém todo o texto até o nome de usuário, capture 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 0 chave é 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 na $Matchesvariável automática Hashtable .

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 permite substituir dinamicamente o texto usando o -replace 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 correspondências encontradas na cadeia de caracteres de entrada.

Os <original> operandos e <substitute> estão sujeitos a regras do mecanismo de expressão regular, como expressões de fuga 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 <substitute> na cadeia de caracteres usando o caractere $ antes do identificador de grupo.

Duas maneiras de referenciar 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 por nome.

    'CONTOSO\Administrator' -replace '\w+\\(?<user>\w+)', 'FABRIKAM\${user}'
    
    FABRIKAM\Administrator
    

A $& expressão representa todo o texto correspondido.

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

Aviso

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, ainda escapar de todas as instâ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.

Confira também