Compartilhar via


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 a 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 por caracteres literais, operadores e outros constructos.

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 a sintaxe e o uso deles 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 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 uma vez, enquanto [^character group] apenas 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 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'

Word caracteres

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 corresponder qualquer caractere de espaço em branco com a classe de \s caracteres. Você pode corresponder 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.

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} Pelo menos 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 ? corresponde ao elemento anterior zero ou uma vez. Como o asterisco *, ele corresponderá 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 {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} Corresponde exatamente n ao número de vezes.
{n,} Corresponder pelo menos n o número de vezes.
{n,m} Corresponder entre n e m o 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 de correspondência 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 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$'

Observação

Ao definir um regex que contém uma $ âncora, coloque 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 .

  • Multilinha: o modo multilinha força ^ e $ a corresponder ao final inicial 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 uma SingleLine. Ele força o . caractere a corresponder a cada caractere (incluindo novas linhas), em vez de corresponder a cada caractere 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 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 corresponder a 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 escapar texto para você.

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

Observação

Isso escapa 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 para escapar.

Outros escapes de caractere

Também há escapes de caracteres reservados que você pode usar para corresponder a tipos de caracteres especiais.

Veja a seguir alguns escapes de caracteres comumente usados:

Escape de caractere 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

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

Um constructo de agrupamento é uma expressão regular cercada por parênteses. Qualquer texto correspondente à expressão regular fechada é 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 $Matches variável automática Hashtable para recuperar o texto capturado. O texto que representa toda a correspondência é 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 inteiros 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 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 $Matches variável automática Hashtable.

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 Agrupando constructos em expressões regulares.

Substituições em expressões regulares

Usar as expressões regulares (regex) com o -replace operador 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 <original> operandos 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 <substitute> 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 – a captura de Grupos são numeradas da esquerda para a direita.

    'John D. Smith' -replace '(\w+) (\w+)\. (\w+)', '$1.$2.$3@contoso.com'
    
    John.D.Smith@contoso.com
    
  • Por Nome – capturar Grupos também pode ser referenciado 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

Aviso

Como o $ caractere é usado na expansão da 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 todas as instâncias de $ para evitar 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