PowerShell
Expresiones regulares
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)
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)