about_Regular_Expressions
Descripción breve
Describe expresiones regulares en PowerShell.
Descripción larga
Nota:
En este artículo se muestran la sintaxis y los métodos para usar expresiones regulares en PowerShell. No cubre todas las expresiones posibles. Para obtener una referencia más completa, consulte lenguaje de expresiones regulares: referencia rápida.
Una expresión regular es un patrón que se usa para hacer coincidir el texto. Se puede componer de caracteres literales, operadores y otras construcciones.
En este artículo se muestra la sintaxis de expresiones regulares en PowerShell. PowerShell tiene varios operadores y cmdlets que usan expresiones regulares. Puede obtener más información sobre su sintaxis y su uso en los vínculos siguientes.
- Select-String
- Operadores -match y -replace
- Operador -split
- switch (instrucción) con la opción -regex
Las expresiones regulares de PowerShell no distinguen mayúsculas de minúsculas de forma predeterminada. Cada método mostrado anteriormente tiene una manera diferente de forzar la distinción entre mayúsculas y minúsculas.
- Para
Select-String
, use el parámetro CaseSensitive . - Para los operadores que usan expresiones regulares, use la versión que distingue mayúsculas de minúsculas:
-cmatch
,-creplace
o-csplit
- Para la
switch
instrucción , use la opción .-casesensitive
Literales de carácter
Una expresión regular puede ser un carácter literal o una cadena. La expresión hace que el motor coincida exactamente con el texto especificado.
# This statement returns true because book contains the string "oo"
'book' -match 'oo'
Clase de caracteres
Aunque los literales de caracteres funcionan si conoce el patrón exacto, las clases de caracteres permiten ser menos específicas.
Grupos de caracteres
[character group]
permite que coincida con cualquier número de caracteres una vez, mientras que [^character group]
solo coincide con los caracteres NO en el grupo.
# This expression returns true if the pattern matches big, bog, or bug.
'big' -match 'b[iou]g'
Si la lista de caracteres que debe coincidir incluye el carácter de guion (-
), debe estar al principio o al final de la lista para distinguirlo de una expresión de intervalo de caracteres.
Intervalos de caracteres
Un patrón también puede ser un intervalo de caracteres. Los caracteres pueden ser alfabéticos [A-Z]
, numéricos [0-9]
o incluso basados en [ -~]
ASCII (todos los caracteres imprimibles).
# This expression returns true if the pattern matches any 2 digit number.
42 -match '[0-9][0-9]'
Números
La \d
clase de caracteres coincidirá con cualquier dígito decimal. Por el contrario, \D
coincidirá con cualquier dígito no decimal.
# This expression returns true if it matches a server name.
# (Server-01 - Server-99).
'Server-01' -match 'Server-\d\d'
Caracteres de palabra
La \w
clase de caracteres coincidirá con cualquier carácter [a-zA-Z_0-9]
de palabra . Para que coincida con cualquier carácter que no sea de palabra, use \W
.
# This expression returns true.
# The pattern matches the first word character 'B'.
'Book' -match '\w'
Comodines
El punto (.
) es un carácter comodín en expresiones regulares. Coincidirá con cualquier carácter excepto una nueva línea (\n
).
# This expression returns true.
# The pattern matches any 4 characters except the newline.
'a1\ ' -match '....'
Espacio en blanco
Puede hacer coincidir cualquier carácter de espacio en blanco con la \s
clase de caracteres. Puede coincidir con cualquier carácter que no sea de espacio en blanco con \S
. Puede hacer coincidir caracteres de espacio literal con
.
# 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- '
Cuantificadores
Los cuantificadores controlan cuántas instancias de cada elemento deben estar presentes en la cadena de entrada.
A continuación se muestran algunos de los cuantificadores disponibles en PowerShell:
Cuantificador | Descripción |
---|---|
* |
Cero o más veces. |
+ |
Una o varias veces. |
? |
Cero o una vez. |
{n,m} |
Al menos n , pero no más de m veces. |
El asterisco (*
) coincide con el elemento anterior cero o más veces. El resultado es que incluso una cadena de entrada sin el elemento sería una coincidencia.
# This returns true for all account name strings even if the name is absent.
'ACCOUNT NAME: Administrator' -match 'ACCOUNT NAME:\s*\w*'
El signo más (+
) coincide con el elemento anterior una o varias veces.
# This returns true if it matches any server name.
'DC-01' -match '[A-Z]+-\d\d'
El signo ?
de interrogación coincide con el elemento anterior cero o una vez. Al igual que el asterisco *
, incluso coincidirá con cadenas donde el elemento está ausente.
# This returns true for any server name, even server names without dashes.
'SERVER01' -match '[A-Z]+-?\d\d'
El {n, m}
cuantificador se puede usar de varias maneras diferentes para permitir el control pormenorizado sobre el cuantificador. El segundo elemento m
y la coma ,
son opcionales.
Cuantificador | Descripción |
---|---|
{n} |
Coincide exactamente con n el número de veces. |
{n,} |
Coincide con al MENOS n el número de veces. |
{n,m} |
Coincidencia entre n y m número de veces. |
# This returns true if it matches any phone number.
'111-222-3333' -match '\d{3}-\d{3}-\d{4}'
Delimitadores
Los delimitadores permiten hacer que una coincidencia se realice correctamente o se produzca un error en función de la posición de coincidencia dentro de la cadena de entrada.
Los dos anclajes usados habitualmente son ^
y $
. El símbolo de intercalación ^
coincide con el inicio de una cadena y $
, que coincide con el final de una cadena. Los delimitadores permiten hacer coincidir el texto en una posición específica, al tiempo que descartan caracteres no deseados.
# The pattern expects the string 'fish' to be the only thing on the line.
# This returns FALSE.
'fishing' -match '^fish$'
Nota:
Al definir una expresión regular que contenga un delimitador ($
), debe incluir la expresión regular entre comillas simples ('
). Si usa comillas dobles ("
), PowerShell interpreta la cadena como una expresión de variable expandible.
Al usar anclajes en PowerShell, debe comprender la diferencia entre las opciones de expresión regular de línea única y multilínea .
- Multilínea: el modo multilínea fuerza
^
y$
para que coincida con el final inicial de cada LÍNEA en lugar del principio y el final de la cadena de entrada. - Singleline: el modo singleline trata la cadena de entrada como SingleLine.
Obliga al
.
carácter a que coincida con cada carácter (incluidas las nuevas líneas), en lugar de coincidir con cada carácter EXCEPTO la nueva línea\n
.
Para obtener más información sobre estas opciones y cómo usarlas, visite el lenguaje de expresiones regulares - Referencia rápida.
Caracteres de escape
La barra diagonal inversa (\
) se usa para escapar caracteres para que el motor de expresiones regulares no los analice.
Los siguientes caracteres están reservados: []().\^$|?*+{}
.
Tendrá que escapar estos caracteres en los patrones para que coincidan con ellos en las cadenas 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,}'
Hay un método estático de la clase regex que puede escapar texto por usted.
[regex]::escape('3.\d{2,}')
3\.\\d\{2,}
Nota:
Esto hace que se escapen todos los caracteres de expresión regular reservados, incluidas las barras diagonales inversas existentes usadas en las clases de caracteres. Asegúrese de usarlo solo en la parte del patrón que necesita para escapar.
Otros escapes de caracteres
También hay escapes de caracteres reservados que puede usar para buscar coincidencias con tipos de caracteres especiales.
A continuación se muestran algunos escapes de caracteres usados habitualmente:
Escape de caracteres | Descripción |
---|---|
\t |
Coincide con una pestaña |
\n |
Coincide con una nueva línea |
\r |
Coincide con un retorno de carro |
Grupos, capturas y sustituciones
La agrupación crea una cadena de entrada independiente en subcadenas que se pueden capturar o omitir. Las subcadenas agrupadas se denominan subexpresiones. De forma predeterminada, las subexpresiones se capturan en grupos numerados, aunque también puede asignar nombres a ellos.
Una construcción de agrupación es una expresión regular rodeada de paréntesis. Se captura cualquier texto coincidente con la expresión regular incluida. En el ejemplo siguiente se divide el texto de entrada en dos grupos de captura.
'The last logged on user was CONTOSO\jsmith' -match '(.+was )(.+)'
True
Use la $Matches
variable automática Hashtable para recuperar texto capturado.
El texto que representa toda la coincidencia se almacena en la clave 0
. Es importante tener en cuenta que la $Matches
tabla hash contiene solo la primera aparición de cualquier patrón coincidente.
$Matches.0
The last logged on user was CONTOSO\jsmith
Las capturas se almacenan en claves enteras numéricas que aumentan de izquierda a derecha. La captura 1
contiene todo el texto hasta que el nombre de usuario, la captura 2
contiene solo el nombre de usuario.
$Matches
Name Value
---- -----
2 CONTOSO\jsmith
1 The last logged on user was
0 The last logged on user was CONTOSO\jsmith
Importante
La 0
clave es un entero. Puede usar cualquier método Hashtable para acceder al valor almacenado.
PS> 'Good Dog' -match 'Dog'
True
PS> $Matches[0]
Dog
PS> $Matches.Item(0)
Dog
PS> $Matches.0
Dog
Capturas con nombre
De forma predeterminada, las capturas se almacenan en orden numérico ascendente, de izquierda a derecha.
También puede asignar un nombre a un grupo de captura. Este nombre se convierte en una clave de la $Matches
variable automática hashtable .
Dentro de un grupo de captura, use ?<keyname>
para almacenar los datos capturados en una clave con nombre.
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
En el ejemplo siguiente se almacena la entrada de registro más reciente en el registro de Seguridad de Windows. La expresión regular proporcionada extrae el nombre de usuario y el dominio del mensaje y los almacena en las claves:N para el nombre y D del dominio.
$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 obtener más información, vea Construcciones de agrupación en expresiones regulares.
Sustituciones en expresiones regulares
El uso de las expresiones regulares (regex) con el -replace
operador permite reemplazar dinámicamente el texto mediante texto capturado.
<input> -replace <original>, <substitute>
<input>
: cadena en la que se va a buscar.<original>
: expresión regular usada para buscar en la cadena de entrada<substitute>
: expresión de sustitución regex para reemplazar coincidencias encontradas en la cadena de entrada.
Los <original>
operandos y <substitute>
están sujetos a reglas del motor de expresiones regulares, como las expresiones de escape o sustitución de caracteres. El patrón de reemplazo puede estar compuesto de una o más sustituciones junto con caracteres literales.
Se puede hacer referencia a grupos de captura en la <substitute>
cadena mediante el $
carácter antes del identificador de grupo.
Dos maneras de hacer referencia a los grupos de captura son por Número y por Nombre.
Por número : los grupos de captura se numeran de izquierda a derecha.
'John D. Smith' -replace '(\w+) (\w+)\. (\w+)', '$1.$2.$3@contoso.com'
John.D.Smith@contoso.com
Por nombre : también se puede hacer referencia a grupos de captura por nombre.
'CONTOSO\Administrator' -replace '\w+\\(?<user>\w+)', 'FABRIKAM\${user}'
FABRIKAM\Administrator
La $&
expresión representa todo el texto coincidente.
'Gobble' -replace 'Gobble', '$& $&'
Gobble Gobble
Advertencia
Dado que el carácter se usa en la $
expansión de cadenas, deberá usar cadenas literales con sustitución o escape del $
carácter al usar comillas dobles.
'Hello World' -replace '(\w+) \w+', '$1 Universe'
"Hello World" -replace "(\w+) \w+", "`$1 Universe"
Hello Universe
Hello Universe
Además, si desea tener como $
carácter literal, use $$
en lugar de los caracteres de escape normales. Cuando se usan comillas dobles, se siguen escapando todas las instancias de $
para evitar la sustitución incorrecta.
'5.72' -replace '(.+)', '$$$1'
"5.72" -replace "(.+)", "`$`$`$1"
$5.72
$5.72
Para obtener información detallada sobre las expresiones de sustitución, vea Sustituciones en expresiones regulares.