Double Commander

2.14. Sintaxis de expresiones regulares

Contenido

1. Introducción
2. Coincidencia simple
3. Secuencias de escape
4. Clases de caracteres
5. Metacaracteres
5.1. Metacaracteres - Separadores de línea
5.2. Metacaracteres - Clases predefinidas
5.3. Metacaracteres - Límites de palabra
5.4. Metacaracteres - Cuantificadores
5.5. Metacaracteres - Alternativas
5.6. Metacaracteres - Subexpresiones
5.7. Metacaracteres - Referencias hacia atrás
6. Aserciones (Lookahead y Lookbehind)
7. Grupos sin captura
8. Grupos atómicos
9. Categorías Unicode
10. Modificadores

Double Commander utiliza la biblioteca gratuita TRegExpr, escrita por Andrey Sorokin.

La mayoría de las explicaciones provienen del archivo de ayuda de esta biblioteca.

1. Introducción

Las expresiones regulares son una forma ampliamente utilizada de especificar patrones de búsqueda de texto. Los caracteres especiales (metacaracteres) nos permiten especificar, por ejemplo, que la cadena específica que estamos buscando aparezca al principio o al final de una línea, o contenga n apariciones de un carácter o grupo de caracteres.

Double Commander admite expresiones regulares en las siguientes funciones:

La biblioteca TRegExpr admite dos modos de operación: ANSI y Unicode. Al buscar en archivos de texto, Double Commander usa ambos (dependiendo de la codificación del archivo). En búsquedas por nombre, se utiliza Unicode.

2. Coincidencia simple

Cualquier carácter individual coincide consigo mismo, a menos que sea un metacarácter con significado especial descrito a continuación.

Una secuencia de caracteres coincide con esa misma secuencia en la cadena objetivo, por lo tanto, el patrón bluh coincidirá con bluh en la cadena objetivo.

Podemos hacer que los metacaracteres o secuencias de escape sean interpretados literalmente anteponiéndoles una barra invertida \. Por ejemplo: el metacarácter ^ coincide con el inicio de la cadena, pero \^ coincide con el carácter ^, \\ coincide con \, etc.

A continuación algunos ejemplos:

Ejemplos de coincidencia simple
ExpresiónResultado
foobar
Coincide con la cadena foobar
\^FooBarPtr
Coincide con ^FooBarPtr

3. Secuencias de escape

Los caracteres pueden especificarse usando una sintaxis similar a las secuencias de escape usadas en C y Perl: \n coincide con un salto de línea, \t con un tabulador, etc.

Más generalmente, \xnn, donde nn es una cadena de dígitos hexadecimales, coincide con el carácter cuyo valor ASCII es nn.

Si necesita un carácter Unicode (de ancho amplio), puede usar \x{nnnn}, donde nnnn – uno o más dígitos hexadecimales.

Secuencias de escape
ExpresiónResultado
\xnn
Carácter con código ASCII nn
\x{nnnn}
Carácter con código ASCII nnnn (un byte para texto normal, dos bytes para Unicode)
\t
Tabulador (HT/TAB), igual que \x09
\n
Salto de línea (NL/LF), igual que \x0a
\r
Retorno de carro (CR), igual que \x0d
\f
Salto de página (FF), igual que \x0c
\a
Alerta (timbre) (BEL), igual que \x07
\e
Escape (ESC), igual que \x1b

A continuación algunos ejemplos:

Ejemplos de secuencias de escape
ExpresiónResultado
foo\x20bar
Coincide con foo bar (observe el espacio en medio)
\tfoobar
Coincide con foobar precedido por un tabulador

4. Clases de caracteres

Puede especificar una clase de caracteres encerrando una lista de caracteres entre corchetes [], lo cual coincidirá con cualquiera de los caracteres en la lista.

Si el primer carácter después de [ es ^, entonces la clase coincide con cualquier carácter que no esté en la lista.

Dentro de la lista, el carácter - se usa para especificar un rango, así que a-z representa todos los caracteres desde a hasta z, inclusive.

Si desea que - forme parte de la clase, colóquelo al inicio o al final de la lista, o escápelo con una barra invertida.

Si desea incluir ], puede colocarlo al inicio de la lista o escaparlo con una barra invertida.

Clases de caracteres
ExpresiónResultado
[-az]
Coincide con a, z y -
[az-]
Coincide con a, z y -
[a\-z]
Coincide con a, z y -
[a-z]
Coincide con las 26 letras minúsculas desde a hasta z
[\n-\x0D]
Coincide con cualquier carácter \x10, \x11, \x12, \x13
[\d-t]
Coincide con cualquier dígito, - o t
[]-a]
Coincide con cualquier carácter desde ] hasta a

A continuación algunos ejemplos:

Ejemplos de clases de caracteres
ExpresiónResultado
foob[aeiou]r
Encuentra cadenas como foobar, foober, etc., pero no foobbr, foobcr, etc.
foob[^aeiou]r
Encuentra cadenas como foobbr, foobcr, etc., pero no foobar, foober, etc.

5. Metacaracteres

Los metacaracteres son la esencia de las expresiones regulares, son caracteres especiales.

Existen diferentes tipos de metacaracteres, como se describe a continuación.

5.1. Metacaracteres - Separadores de línea

Algunas expresiones ayudan a detectar separadores de línea.

Separadores de línea
ExpresiónResultado
^
Inicio de línea
$
Fin de línea
\A
Inicio del texto
\Z
Fin del texto
.
Cualquier carácter en la línea

A continuación algunos ejemplos:

Ejemplos de separadores de línea
ExpresiónResultado
^foobar
Solo coincide si la cadena foobar está al inicio de una línea
foobar$
Solo coincide si la cadena foobar está al final de una línea
^foobar$
Solo coincide si la cadena foobar es la única en la línea
foob.r
Coincide con cadenas como foobar, foobbr, foob1r, etc.

Por defecto, el metacarácter ^ solo garantiza coincidir al inicio de la cadena de entrada/texto, y $ solo al final. Los separadores de línea incrustados no coinciden con ^ o $.

Sin embargo, es posible tratar la cadena como un búfer multilínea, de modo que ^ coincida después de cualquier separador de línea dentro de la cadena, y $ antes de cualquier separador de línea. Esto se logra activando el modificador m.

\A y \Z funcionan como ^ y $, pero cuando se usa el modificador m, no coinciden varias veces, mientras que ^ y $ coincidirán en cada separador de línea interno.

Por defecto, el metacarácter . coincide con cualquier carácter, pero si se desactiva el modificador s, . no coincidirá con los separadores de línea incrustados.

TRegExpr maneja los separadores de línea según el Estándar Técnico Unicode (Estándar técnico #18):

Tenga en cuenta que ^.*$ (patrón de línea vacía) no coincide con una cadena vacía en la secuencia \x0D\x0A, pero sí en la secuencia \x0A\x0D.

5.2. Metacaracteres - Clases predefinidas

Algunas expresiones ayudan a detectar grupos de caracteres.

Clases predefinidas
ExpresiónResultado
\w
Caracteres alfanuméricos (incluyendo _), es decir, [0-9A-Za-z_]
\W
Caracteres no alfanuméricos
\d
Caracteres numéricos
\D
Caracteres no numéricos
\s
Cualquier carácter de espacio en blanco (igual que [ \t\n\r\f])
\S
Caracteres que no son espacios en blanco

Puede usar \w, \d y \s dentro de clases de caracteres personalizadas.

A continuación algunos ejemplos:

Ejemplos de clases predefinidas
ExpresiónResultado
foob\dr
Coincide con cadenas como foob1r, foob6r, etc., pero no con foobar, foobbr, etc.
foob[\w\s]r
Coincide con cadenas como foobar, foob r, foobbr, etc., pero no con foob=r, etc.

5.3. Metacaracteres - Límites de palabra

Un límite de palabra (\b) es la posición entre dos caracteres donde uno es \w y el otro es \W (en cualquier orden), considerando los caracteres imaginarios al inicio y final de la cadena como si coincidieran con \W.

Límites de palabra
ExpresiónResultado
\b
Coincide con un límite de palabra
\B
Coincide con un lugar que NO es un límite de palabra

5.4. Metacaracteres - Cuantificadores

Cualquier elemento de una expresión regular puede ser seguido por otro tipo de metacaracteres – cuantificadores.

Con estos metacaracteres puedes especificar cuántas veces debe aparecer el carácter anterior, metacarácter o subexpresión.

Cuantificadores
ExpresiónResultado
*
Cero o más veces ("codicioso"), similar a {0,}
+
Una o más veces ("codicioso"), similar a {1,}
?
Cero o una vez ("codicioso"), similar a {0,1}
{n}
Exactamente n veces ("codicioso")
{n,}
Al menos n veces ("codicioso")
{n,m}
Al menos n veces pero no más de m veces ("codicioso")
*?
Cero o más veces ("no codicioso"), similar a {0,}?
+?
Una o más veces ("no codicioso"), similar a {1,}?
??
Cero o una vez ("no codicioso"), similar a {0,1}?
{n}?
Exactamente n veces ("no codicioso")
{n,}?
Al menos n veces ("no codicioso")
{n,m}?
Al menos n veces pero no más de m veces ("no codicioso")

Así, los números entre llaves en la forma {n,m} especifican el número mínimo de veces n y el número máximo de veces m que debe coincidir el elemento.

La forma {n} equivale a {n,n} y coincide exactamente n veces.

La forma {n,} coincide n veces o más.

No hay límite para el tamaño de n o m, pero los números grandes ralentizarán la ejecución y consumirán más memoria.

Si las llaves aparecen en cualquier otro contexto, se tratan como caracteres normales.

A continuación algunos ejemplos:

Ejemplos de cuantificadores
ExpresiónResultado
foob.*r
Coincide con cadenas como foobar, foobalkjdflkj9r y foobr
foob.+r
Coincide con cadenas como foobar, foobalkjdflkj9r, pero no con foobr
foob.?r
Coincide con cadenas como foobar, foobbr y foobr, pero no con foobalkj9r
fooba{2}r
Coincide con la cadena foobaar
fooba{2,}r
Coincide con cadenas como foobaar, foobaaar, foobaaaar, etc.
fooba{2,3}r
Coincide con cadenas como foobaar o foobaaar, pero no con foobaaaar

Una breve explicación sobre "codicia".

"Codicioso" toma lo máximo posible, "no codicioso" toma lo mínimo posible.

Por ejemplo, aplicando b+ y b* a la cadena abbbbc devuelve bbbb, b+? devuelve b, b*? devuelve una cadena vacía, b{2,3}? devuelve bb, b{2,3} devuelve bbb.

Puedes cambiar todos los cuantificadores al modo "no codicioso" (ver modificador g).

5.5. Metacaracteres - Alternativas

Puedes especificar un patrón usando una serie de alternativas separadas por |, por lo tanto fee|fie|foe coincidirá con fee, fie o foe en la cadena objetivo (lo mismo sucede con f(e|i|o)e).

La primera alternativa incluye todo desde el último separador de patrón ((, [ o el comienzo del patrón) hasta el primer |, y la última alternativa contiene todo desde el último | hasta el siguiente separador de patrón.

Por lo tanto, es común rodear las alternativas con paréntesis para minimizar la confusión sobre dónde comienzan y terminan.

Las alternativas se intentan de izquierda a derecha, por lo tanto, la primera alternativa que haga coincidir toda la expresión será seleccionada.

Esto significa que las alternativas no necesariamente son codiciosas.

Por ejemplo: al usar foo|foot para coincidir con barefoot, solo coincidirá la parte foo, porque es la primera alternativa probada y coincide exitosamente con la cadena objetivo. (Esto puede no ser importante cuando usamos paréntesis para capturar texto coincidente.)

También recuerda que | se interpreta literalmente dentro de corchetes, por lo tanto, si escribes [fee|fie|foe], realmente solo coincide con [feio|].

Ejemplos:

Ejemplos de alternativas
ExpresiónResultado
foo(bar|foo)
Coincide con la cadena foobar o foofoo

5.6. Metacaracteres - Subexpresiones

La estructura de paréntesis ( ... ) también se puede usar para definir subexpresiones de expresiones regulares.

Después de la búsqueda, puedes invocar cualquier subexpresión, también puedes usar subexpresiones como máscaras.

Las subexpresiones se numeran según el orden de sus paréntesis izquierdos de izquierda a derecha.

La primera subexpresión se numera como 1, y se admiten hasta 90 subexpresiones (la coincidencia completa de la expresión regular se numera como 0 – puedes reemplazarla con $0 o $&).

A continuación algunos ejemplos:

Subexpresiones
ExpresiónResultado
(foobar){8,10}
Coincide con una cadena que contiene 8, 9 o 10 instancias de foobar
foob([0-9]|a+)r
Coincide con foob0r, foob1r, foobar, foobaar, foobaar, etc.

Notas sobre la plantilla "Reemplazar con":

Ejemplo:

Invertimos la fecha 21.01.2018 a 2018.01.21:
  Buscar: (\d{2})\.(\d{2})\.(\d{4})
  Reemplazar con: $3.$2.$1

5.7. Metacaracteres - Referencias hacia atrás

Los metacaracteres \1 a \9 se interpretan como referencias hacia atrás. \n coincide con la subexpresión n previamente coincidente.

A continuación algunos ejemplos:

Ejemplos de referencias hacia atrás
ExpresiónResultado
(.)\1+
Coincide con aaaa y cc
(.+)\1+
También coincide con abab y 123123
(['"]?)(\d+)\1
Coincide con "13" (entre comillas dobles), '4' (entre comillas simples) o 77 (sin comillas), etc.

6. Aserciones (Lookahead y Lookbehind)

Aserción positiva lookahead: foo(?=bar) coincide con foo solo si le sigue bar, y bar no se incluye en la coincidencia.

Aserción negativa lookahead: foo(?!bar) coincide con foo solo si no le sigue bar.

Aserción positiva lookbehind: (?<=foo)bar coincide con bar solo si está precedido por foo, y foo no se incluye en la coincidencia.

Aserción negativa lookbehind: (?<!foo)bar coincide con bar solo si no está precedido por foo.

Restricciones:

7. Grupos sin captura

Sintaxis: (?:expr).

Este tipo de grupo no tiene "índice", por lo que no es visible para referencias posteriores. Usamos grupos sin captura cuando queremos agrupar subexpresiones pero no deseamos guardarlas como parte de la coincidencia/captura del string. El uso de grupos sin captura acelera el procesamiento de la expresión regular.

Grupos sin captura
ExpresiónResultado
(https?|ftp)://([^/\r\n]+)
Coincide con https y doublecmd.sourceforge.io en https://doublecmd.sourceforge.io
(?:https?|ftp)://([^/\r\n]+)
Solo coincide con doublecmd.sourceforge.io en https://doublecmd.sourceforge.io

8. Grupos atómicos

Sintaxis: (?>expr|expr|...).

Los grupos atómicos son un caso especial de grupos sin captura: si ya se ha encontrado una parte del patrón, este tipo de agrupación deshabilita el retroceso (backtracking) del grupo entre paréntesis. Los grupos atómicos trabajan más rápido y son útiles para optimizar grupos con muchas expresiones diferentes.

Por ejemplo, a(bc|b)c coincide con abcc y abc; a(?>bc|b)c coincide con abcc pero no con abc, porque el motor está prohibido de retroceder e intentar establecer el grupo como b.

9. Categorías Unicode

El estándar Unicode asigna nombres a categorías de caracteres. Estos son strings de dos letras. Por ejemplo, Lu representa letras mayúsculas, Ll letras minúsculas. La categoría mayor de una sola letra L representa todas las letras.

Categorías Unicode
CategoríaDescripción
L
Letras
Lu
Letra mayúscula
Ll
Letra minúscula
Lt
Letra título
Lm
Letra modificadora
Lo
Otra letra
M
Marcas
Mn
Marca no espaciadora
Mc
Marca espaciadora combinante
Me
Marca adjunta
N
Números
Nd
Número decimal
Nl
Número letra
No
Otro número
P
Puntuación
Pc
Puntuación conector
Pd
Guión
Ps
Signo de apertura
Pe
Signo de cierre
Pi
Signo inicial
Pf
Signo final
Po
Otra puntuación
S
Símbolos
Sm
Símbolo matemático
Sc
Símbolo monetario
Sk
Símbolo modificador
So
Otro símbolo
Z
Separadores
Zs
Separador de espacio
Zl
Separador de línea
Zp
Separador de párrafo
C
Otros
Cc
Control
Cf
Formato
Cs
Sustituto
Co
Uso privado
Cn
Sin asignar

El metacarácter \p representa un carácter Unicode de la categoría especificada. Sintaxis: \pL y \p{L} para nombres de una letra, \p{Lu} para nombres de dos letras.

El metacarácter \P es inverso, representa un carácter Unicode que NO pertenece a la categoría especificada.

Estos metacaracteres también están soportados dentro de clases de caracteres.

10. Modificadores

Sintaxis de un solo modificador: (?i) para activar, (?-i) para desactivar. Se permiten varios modificadores, por ejemplo: (?msgxr-imsgxr).

Los modificadores se utilizan para cambiar el comportamiento de las expresiones regulares. Solo afectan a la parte de la expresión regular que sigue al operador (?imsgxr-imsgxr).

Cualquiera de estos modificadores se puede incrustar directamente en la expresión regular. Si un modificador se aplica a una subexpresión, solo afectará a esa subexpresión.

i
Realiza una comparación de patrones sin distinguir mayúsculas de minúsculas (utilizando la configuración regional instalada en el sistema). Está desactivado por defecto.
m
Trata la cadena como multilínea. Es decir, cambia ^ y $ para que coincidan con el inicio o final de cualquier línea dentro de la cadena, no solo con el inicio o final de la cadena completa. Consulte también separadores de línea. Está desactivado por defecto.
s
Trata la cadena como una sola línea. Es decir, hace que . coincida con cualquier carácter, incluso con separadores de línea (consulte también separadores de línea), cosa que normalmente no haría. Está activado por defecto.
g
Modificador no estándar. Desactivarlo cambia todos los operadores posteriores al modo no codicioso (por defecto este modificador está activado). Así, si el modificador g está desactivado, + funciona como +?, * como *?, etc.
x
Extiende la legibilidad del patrón permitiendo espacios y comentarios (ver explicación más abajo). Está desactivado por defecto.
r
Modificador no estándar. Si está activado, el rango а-я incluye además la letra rusa ё, А-Я incluye además Ё, y а-Я incluye todas las letras rusas. Está activado por defecto.
#
(?#texto): comentario, el texto se ignora. Tenga en cuenta que TRegExpr cierra el comentario cuando encuentra ), por lo que no se puede incluir un ) literal dentro del comentario.

A continuación algunos ejemplos:

Ejemplos de extensiones Perl
ExpresiónResultado
(?i)Saint-Petersburg
Coincide con Saint-petersburg y Saint-Petersburg
(?i)Saint-(?-i)Petersburg
Coincide con Saint-Petersburg pero no con Saint-petersburg
(?i)(Saint-)?Petersburg
Coincide con Saint-petersburg y saint-petersburg
((?i)Saint-)?Petersburg
Coincide con saint-Petersburg pero no con saint-petersburg

El modificador x requiere una explicación adicional.

Indica que se deben ignorar los espacios que no estén precedidos por una barra invertida ni dentro de una clase de caracteres.

Puede utilizarlo para dividir la expresión regular en partes (algo) más legibles.

El carácter # también se considera un metacarácter que introduce comentarios, por ejemplo:

(
  (abc) # Comentario 1
    |   # Puede usar espacios para dar formato a la expresión regular - TRegExpr los ignorará
  (efg) # Comentario 2
)

Esto también implica que si desea usar espacios reales o el carácter # en el patrón (fuera de una clase de caracteres, ya que estos no se ven afectados por x), debe escaparlos o codificarlos mediante secuencias de escape octal o hexadecimal.

En general, estas características mejoran considerablemente la legibilidad del texto de la expresión regular.


HTML 4.0 Transition válido ¡CSS Válido!