about_Regular_Expressions

Breve descrição

Descreve expressões regulares no PowerShell.

Descrição longa

Nota

Este artigo mostrará a sintaxe e os métodos para usar expressões regulares no PowerShell, nem toda sintaxe é discutida. Para obter uma referência mais completa, consulte Linguagem de expressão regular - Referência rápida.

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 sensibilidade a maiúsculas e minúsculas.

  • Para Select-String, use o parâmetro CaseSensi .
  • 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 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 que você corresponda a qualquer número de caracteres uma vez, enquanto [^character group] só corresponde a caracteres NÃ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 ser correspondida 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 uma variedade 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 caracteres 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'

Carateres universais

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 '....'

Whitespace

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:

Quantifier Description
* 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 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 vai até mesmo corresponder strings 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.

Quantifier Description
{n} Corresponda EXATAMENTE n o 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 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$'

Nota

Ao definir um regex contendo uma $ âncora, certifique-se de incluir o regex usando 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 Singleline e Multiline .

  • Multiline: Multiline mode forces ^ e $ para corresponder ao início final de cada LINE em vez do início e fim da cadeia de entrada.
  • Singleline: o modo Singleline 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.

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 em seus padrões para combiná-los em suas cadeias 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,}

Nota

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.

Outras fugas de personagens

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 Description
\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. Qualquer texto correspondido pela 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 notar 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 teclas inteiras numéricas que aumentam da esquerda para a direita. Capture 1 contém todo o texto até que 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 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 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 que você substitua -replace dinamicamente o texto usando o 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 à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 <substitute> na cadeia de caracteres 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 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 escape 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.

Consulte também