Buscar..


Sintaxis

  • 'text' -match 'RegExPattern'
  • 'text' -replace 'RegExPattern', 'newvalue'
  • [regex] :: Match ("text", "pattern") #Single match
  • [regex] :: Coincidencias ("texto", "patrón") #Múltiples coincidencias
  • [regex] :: Reemplazar ("texto", "patrón", "nuevo valor")
  • [regex] :: Replace ("text", "pattern", {param ($ m)}) #MatchEvaluator
  • [regex] :: Escape ("input") #Escape caracteres especiales

Partido individual

Puede determinar rápidamente si un texto incluye un patrón específico utilizando Regex. Hay varias formas de trabajar con Regex en PowerShell.

#Sample text
$text = @"
This is (a) sample
text, this is
a (sample text)
"@

#Sample pattern: Content wrapped in ()
$pattern = '\(.*?\)'

Usando el operador -Match

Para determinar si una cadena coincide con un patrón utilizando el operador -matches de -matches , use la sintaxis 'input' -match 'pattern' . Esto devolverá true o false dependiendo del resultado de la búsqueda. Si hubo coincidencia, puede ver la coincidencia y los grupos (si están definidos en el patrón) accediendo a la variable $Matches .

> $text -match $pattern
True

> $Matches

Name Value
---- -----
0    (a)  

También puede usar -match para filtrar a través de una matriz de cadenas y solo devolver las cadenas que contienen una coincidencia.

> $textarray = @"
This is (a) sample
text, this is
a (sample text)
"@ -split "`n"

> $textarray -match $pattern
This is (a) sample
a (sample text)
2.0

Usando Select-String

PowerShell 2.0 introdujo un nuevo cmdlet para buscar en texto usando expresiones regulares. Devuelve un objeto MatchInfo por entrada de texto que contiene una coincidencia. Puedes acceder a sus propiedades para encontrar grupos coincidentes, etc.

> $m = Select-String -InputObject $text -Pattern $pattern

> $m

This is (a) sample
text, this is
a (sample text)

> $m | Format-List *

IgnoreCase : True
LineNumber : 1
Line       : This is (a) sample
             text, this is
             a (sample text)
Filename   : InputStream
Path       : InputStream
Pattern    : \(.*?\)
Context    : 
Matches    : {(a)}

Como -match , Select-String también se puede usar para filtrar a través de una matriz de cadenas al canalizar una matriz a la misma. Crea un objeto MatchInfo por cadena que incluye una coincidencia.

> $textarray | Select-String -Pattern $pattern

This is (a) sample
a (sample text)

#You can also access the matches, groups etc.
> $textarray | Select-String -Pattern $pattern | fl *


IgnoreCase : True
LineNumber : 1
Line       : This is (a) sample
Filename   : InputStream
Path       : InputStream
Pattern    : \(.*?\)
Context    : 
Matches    : {(a)}

IgnoreCase : True
LineNumber : 3
Line       : a (sample text)
Filename   : InputStream
Path       : InputStream
Pattern    : \(.*?\)
Context    : 
Matches    : {(sample text)}

Select-String también puede buscar usando un patrón de texto normal (sin -SimpleMatch regulares) agregando el interruptor -SimpleMatch .

Usando [RegEx] :: Match ()

También puede usar el método estático Match() disponible en la clase .NET [RegEx] .

> [regex]::Match($text,$pattern)

Groups   : {(a)}
Success  : True
Captures : {(a)}
Index    : 8
Length   : 3
Value    : (a)

> [regex]::Match($text,$pattern) | Select-Object -ExpandProperty Value
(a)

Reemplazar

Una tarea común para las expresiones regulares es reemplazar el texto que coincida con un patrón con un nuevo valor.

#Sample text
$text = @"
This is (a) sample
text, this is
a (sample text)
"@

#Sample pattern: Text wrapped in ()
$pattern = '\(.*?\)'

#Replace matches with:
$newvalue = 'test'

Usando el operador de reemplazo

El operador -replace en PowerShell se puede usar para reemplazar el texto que coincida con un patrón con un nuevo valor usando la sintaxis 'input' -replace 'pattern', 'newvalue' .

> $text -replace $pattern, $newvalue
This is test sample
text, this is
a test

Usando el método [RegEx] :: Replace ()

El reemplazo de coincidencias también se puede hacer usando el método Replace() en la clase [RegEx] .NET.

[regex]::Replace($text, $pattern, 'test')
This is test sample
text, this is
a test

Reemplace el texto con un valor dinámico utilizando un MatchEvalutor

A veces es necesario reemplazar un valor que coincida con un patrón con un nuevo valor que se base en esa coincidencia específica, lo que hace imposible predecir el nuevo valor. Para estos tipos de escenarios, un MatchEvaluator puede ser muy útil.

En PowerShell, un MatchEvaluator es tan simple como un bloque de script con un solo parámetro que contiene un objeto Match para la coincidencia actual. La salida de la acción será el nuevo valor para esa coincidencia específica. MatchEvalutor se puede usar con el método estático [Regex]::Replace() .

Ejemplo : reemplazar el texto dentro de () con su longitud

#Sample text
$text = @"
This is (a) sample
text, this is
a (sample text)
"@
    
#Sample pattern: Content wrapped in ()
$pattern = '(?<=\().*?(?=\))'

$MatchEvalutor = {
    param($match)

    #Replace content with length of content
    $match.Value.Length

}

Salida:

> [regex]::Replace($text, $pattern, $MatchEvalutor)

This is 1 sample
text, this is
a 11

Ejemplo: hacer una sample en mayúsculas

#Sample pattern: "Sample"
$pattern = 'sample'

$MatchEvalutor = {
    param($match)

    #Return match in upper-case
    $match.Value.ToUpper()

}

Salida:

> [regex]::Replace($text, $pattern, $MatchEvalutor)

This is (a) SAMPLE
text, this is
a (SAMPLE text)

Escapar de personajes especiales.

Un patrón de expresiones regulares usa muchos caracteres especiales para describir un patrón. Ej., . significa "cualquier carácter", + es "uno o más", etc.

Para utilizar estos caracteres, como a . , + etc., en un patrón, debes escapar de ellos para eliminar su significado especial. Esto se hace usando el carácter de escape que es una barra invertida \ en regex. Ejemplo: Para buscar + , usarías el patrón \+ .

Puede ser difícil recordar todos los caracteres especiales en expresiones regulares, por lo que para escapar de cada carácter especial en una cadena que desea buscar, puede usar el método [RegEx]::Escape("input") .

> [regex]::Escape("(foo)")
\(foo\)

> [regex]::Escape("1+1.2=2.2")
1\+1\.2=2\.2

Múltiples partidos

Hay varias formas de encontrar todas las coincidencias para un patrón en un texto.

#Sample text
$text = @"
This is (a) sample
text, this is
a (sample text)
"@

#Sample pattern: Content wrapped in ()
$pattern = '\(.*?\)'

Usando Select-String

Puede encontrar todas las coincidencias (coincidencia global) agregando el interruptor -AllMatches a Select-String .

> $m = Select-String -InputObject $text -Pattern $pattern -AllMatches

> $m | Format-List *

IgnoreCase : True
LineNumber : 1
Line       : This is (a) sample
             text, this is
             a (sample text)
Filename   : InputStream
Path       : InputStream
Pattern    : \(.*?\)
Context    : 
Matches    : {(a), (sample text)}

#List all matches
> $m.Matches

Groups   : {(a)}
Success  : True
Captures : {(a)}
Index    : 8
Length   : 3
Value    : (a)

Groups   : {(sample text)}
Success  : True
Captures : {(sample text)}
Index    : 37
Length   : 13
Value    : (sample text)

#Get matched text
> $m.Matches | Select-Object -ExpandProperty Value
(a)
(sample text)

Usando [RegEx] :: Coincidencias ()

El método Matches() en .NET `[regex] -class también se puede usar para hacer una búsqueda global de múltiples coincidencias.

> [regex]::Matches($text,$pattern)

Groups   : {(a)}
Success  : True
Captures : {(a)}
Index    : 8
Length   : 3
Value    : (a)

Groups   : {(sample text)}
Success  : True
Captures : {(sample text)}
Index    : 37
Length   : 13
Value    : (sample text)

> [regex]::Matches($text,$pattern) | Select-Object -ExpandProperty Value

(a)
(sample text)


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow