La búsqueda de ca­ra­c­te­res o se­cue­n­cias concretas de ca­ra­c­te­res en do­cu­me­n­tos forma parte de las tareas estándar y re­cu­rre­n­tes de la te­c­no­lo­gía de la in­fo­r­ma­ción. Por lo general, el objetivo es modificar o sustituir fra­g­me­n­tos de texto o líneas de código, cuya co­m­ple­ji­dad aumenta en función de las veces que la secuencia de ca­ra­c­te­res aparece en el documento. En la década de 1950 se encontró una solución basada en las lenguas formales de la in­fo­r­má­ti­ca teórica que sigue presente en el de­sa­rro­llo actual de software y que permite si­m­pli­fi­car estas tareas re­pe­ti­ti­vas mediante el uso de las de­no­mi­na­das ex­pre­sio­nes regulares (en inglés, regular ex­pre­s­sio­ns).

¿Qué es una expresión regular?

Las regex (en inglés, regular ex­pre­s­sio­ns) son las unidades de de­s­cri­p­ción de los lenguajes regulares, que se incluyen en los de­no­mi­na­dos lenguajes formales. Son un in­s­tru­me­n­to clave de la in­fo­r­má­ti­ca teórica, la cual, entre otras cosas, establece las bases para el de­sa­rro­llo y la ejecución de programas in­fo­r­má­ti­cos, así como para la co­n­s­tru­c­ción del co­m­pi­la­dor necesario para ello. Es por esto que las ex­pre­sio­nes regulares, también de­no­mi­na­das regex y basadas en reglas si­n­tá­c­ti­cas cla­ra­me­n­te definidas, se utilizan pri­n­ci­pa­l­me­n­te en el ámbito del de­sa­rro­llo de software.

Para cada regex existe un de­no­mi­na­do autómata finito (también conocido como máquina de estado finito) que acepta el lenguaje es­pe­ci­fi­ca­do por la expresión y que, con ayuda de la co­n­s­tru­c­ción de Thompson, se de­sa­rro­lla a partir de una expresión regular. Por otro lado, para cada autómata finito también hay una expresión regular que describe el lenguaje aceptado por el autómata. Este puede generarse bien con el algoritmo de Kleene o bien con la eli­mi­na­ción de estados.

Nota

Un autómata es un modelo de conducta formado por estados, tra­n­si­cio­nes de estado y acciones. Por tanto, se considera que es finito si la cantidad de estados que puede adoptar es finita (es decir, limitada).

Un claro ejemplo del uso de regex en la te­c­no­lo­gía de la in­fo­r­ma­ción es la función de buscar y re­em­pla­zar de los editores de texto, la cual fue im­ple­me­n­ta­da por primera vez en los años 60 por el pionero en las ciencias de la co­mpu­tación, Ken Thompson, uno de los de­sa­rro­lla­do­res del sistema operativo UNIX, en el editor de texto por línea QED y po­s­te­rio­r­me­n­te en sus sucesores. Esta función permite buscar de­te­r­mi­na­das se­cue­n­cias de ca­ra­c­te­res en los textos y, si se desea, re­em­pla­zar­las por otra secuencia de ca­ra­c­te­res cua­l­quie­ra.

De­fi­ni­ción: Expresión Regular (regex)

Las regex son cadenas de ca­ra­c­te­res basadas en reglas si­n­tá­c­ti­cas que permiten describir se­cue­n­cias de ca­ra­c­te­res. Así, forman parte de los lenguajes regulares, los cuales son un subgrupo de los lenguajes formales, de gran im­po­r­ta­n­cia para la te­c­no­lo­gía de la in­fo­r­ma­ción y, es­pe­cia­l­me­n­te, para el de­sa­rro­llo de software.

¿Cómo funciona una expresión regular?

Una expresión regular puede estar formada, o bien ex­clu­si­va­me­n­te por ca­ra­c­te­res normales (como abc), o bien por una co­m­bi­na­ción de ca­ra­c­te­res normales y me­ta­ca­ra­c­te­res (como ab*c). Los me­ta­ca­ra­c­te­res describen ciertas co­n­s­tru­c­cio­nes o di­s­po­si­cio­nes de ca­ra­c­te­res: por ejemplo, si un carácter debe estar en el inicio de la línea o si un carácter solo debe o puede aparecer exac­ta­me­n­te una vez, más veces o menos. Ambos ejemplos de ex­pre­sio­nes regulares funcionan, por ejemplo, de la siguiente manera:

abc. El patrón regex sencillo abc requiere una coin­ci­de­n­cia exacta. Por tanto, se buscarán cadenas de ca­ra­c­te­res que no solo contengan los ca­ra­c­te­res “abc”, sino que también aparezcan en ese orden. Una pregunta como “¿Conoces la plaza ABC?” ofrece la coin­ci­de­n­cia buscada por esta expresión.

ab*c. Las ex­pre­sio­nes regulares con ca­ra­c­te­res es­pe­cia­les funcionan de manera diferente, ya que no solo se buscarán coin­ci­de­n­cias exactas, si no también es­ce­na­rios es­pe­cia­les. En este caso, el asterisco hace que la búsqueda se centre en cadenas de ca­ra­c­te­res que empiecen por la letra “a” y que terminen por la letra “c” y en­tre­me­dias cuenten con cualquier número de ca­ra­c­te­res “b”. Así se mostrará como coin­ci­de­n­cia tanto “abc”, como la cadena de ca­ra­c­te­res “abbbbc” y “cbbabbcba”.

Además, cada regex se puede vincular a una acción concreta, como la ya me­n­cio­na­da “Re­em­pla­zar”. Esta acción se ejecuta en todos los lugares en los que se detecta la expresión regular, es decir, en todos los puntos en los que haya una coin­ci­de­n­cia similar a la de los ejemplos.

¿Qué retos presenta el uso de las ex­pre­sio­nes regulares?

Trabajar con in­s­tru­c­cio­nes regex da margen para tomarse muchas li­be­r­ta­des, pues siempre habrá varias so­lu­cio­nes posibles para cada tarea que se desee resolver con una expresión regular. El hecho de que el resultado deseado se pueda obtener de di­fe­re­n­tes maneras, no obstante, no siempre se puede co­n­si­de­rar una ventaja:

Para asegurar que se logrará el objetivo en todos los casos, pueden uti­li­zar­se in­s­tru­c­cio­nes muy generales, pero, si se busca un resultado más exacto, entonces será in­e­vi­ta­ble formular un patrón regex es­pe­cí­fi­co. También vale la pena co­n­si­de­rar la longitud: cuanto más compacta sea la expresión regular, menor será su tiempo de pro­ce­sa­mie­n­to. No obstante, no se debe descuidar la le­gi­bi­li­dad. Si las in­s­tru­c­cio­nes ori­gi­na­les son demasiado co­m­pli­ca­das y no tienen co­me­n­ta­rios, mo­di­fi­car­las a po­s­te­rio­ri es muy difícil.

Por lo general, para la creación de ex­pre­sio­nes regulares se debe dar con la co­m­bi­na­ción perfecta entre co­m­pa­ci­dad y es­pe­ci­fi­ci­dad.

¿Qué reglas si­n­tá­c­ti­cas son válidas para las ex­pre­sio­nes regulares?

Las ex­pre­sio­nes regulares se pueden aplicar en diversos lenguajes, tales como Perl, Python, Ruby, Ja­va­S­cri­pt, XML o HTML, por lo que los usos o funciones pueden llegar a ser muy di­fe­re­n­tes. En Ja­va­S­cri­pt los patrones regex se utilizan, por ejemplo, en los métodos de cadena search(), match() o replace(), mientras que las ex­pre­sio­nes en do­cu­me­n­tos XML sirven para limitar elementos de contenido. En lo que respecta a la sintaxis, entre los di­fe­re­n­tes lenguajes de pro­gra­ma­ción y lenguajes de marcado apenas hay di­fe­re­n­cias en cuanto a las ex­pre­sio­nes regulares:

Así, una expresión regular puede estar formada por hasta tres partes, in­de­pe­n­die­n­te­me­n­te del lenguaje en el que se va a utilizar:

Pattern (patrón de búsqueda) El elemento central es el patrón, esto es, el patrón de búsqueda general. Tal y como hemos explicado antes, se puede formar a partir de ca­ra­c­te­res simples o a partir de una co­m­bi­na­ción de ca­ra­c­te­res simples y es­pe­cia­les.
Delimiter (de­li­mi­ta­dor) El inicio y el final del patrón se ide­n­ti­fi­can con de­li­mi­ta­do­res. Los de­li­mi­ta­do­res son, bá­si­ca­me­n­te, todos los ca­ra­c­te­res no al­fa­nu­mé­ri­cos (excepto la barra diagonal inversa). Por ejemplo, para PHP las al­moha­di­llas (#pattern#), los signos de po­r­ce­n­ta­je (%pattern%), el signo más (+pattern+) o las tildes (~pattern~) son de­li­mi­ta­do­res. La mayoría de lenguajes ya usan las comillas (“pattern”) o las barras dia­go­na­les (/pattern/).
Modifier (mo­di­fi­ca­dor) Los mo­di­fi­ca­do­res pueden añadirse a un patrón de búsqueda para modificar la expresión regular. Un ejemplo es el mo­di­fi­ca­dor i, el cual anula la di­s­ti­n­ción entre ma­yú­s­cu­las y mi­nú­s­cu­las. Garantiza que las ma­yú­s­cu­las y las mi­nú­s­cu­las se tienen en co­n­si­de­ra­ción y que valen por defecto para todas las ex­pre­sio­nes regulares.

A co­n­ti­nua­ción, listamos algunos de los ca­ra­c­te­res es­pe­cia­les de sintaxis que pueden ampliar los patrones con opciones es­pe­cí­fi­cas:

Ca­ra­c­te­res es­pe­cia­les regex de sintaxis Función
[] Los corchetes ide­n­ti­fi­can a una clase de ca­ra­c­te­res que siempre re­pre­se­n­ta a un único carácter en un patrón de búsqueda.
() Los pa­ré­n­te­sis ide­n­ti­fi­can un grupo de ca­ra­c­te­res formado por uno o varios ca­ra­c­te­res y que pueden operarse unos dentro de los otros.
- Funciona a modo de es­pe­ci­fi­ca­ción del área (de […] hasta […]) cuando se sitúa entre dos ca­ra­c­te­res normales.
^ Limita la búsqueda al inicio de una línea (otra función: elemento de negación en clases de ca­ra­c­te­res).
$ Limita la búsqueda al final de una línea.
. Equivale a cualquier carácter.
* El número del carácter, de la clase o del grupo situado antes del asterisco puede ser aleatorio (cero incluido).
+ El carácter, la clase o el grupo antes de un signo más debe aparecer como mínimo una vez.
? El carácter, la clase o el grupo antes del signo de in­te­rro­ga­ción es opcional y puede aparecer como máximo una vez.
{n} El carácter, la clase o el grupo an­te­rio­res aparecen exac­ta­me­n­te n veces.
{n,m} El carácter, la clase o el grupo an­te­rio­res aparecen como mínimo n veces y como máximo m veces.
{n,} El carácter, la clase o el grupo an­te­rio­res aparecen como mínimo n veces o con fre­cue­n­cia.
\b Tiene en cuenta el límite de palabra durante la búsqueda.
\B Ignora el límite de palabra durante la búsqueda.
\d Cualquier dígito; abre­via­tu­ra para la clase de ca­ra­c­te­res [0-9].
\D Cualquier no dígito; abre­via­tu­ra para la clase de ca­ra­c­te­res [^0-9].
\w Cualquier carácter al­fa­nu­mé­ri­co; abre­via­tu­ra para la clase de ca­ra­c­te­res [a-zA-Z_0-9].
\W Cualquier carácter no al­fa­nu­mé­ri­co; abre­via­tu­ra para la clase de ca­ra­c­te­res [^\w].

Tutorial: las ex­pre­sio­nes regulares ex­pli­ca­das con ejemplos

Una vez resumidos los conceptos básicos de regex en los apartados an­te­rio­res, pasamos ahora a explicar el modo de fu­n­cio­na­mie­n­to de estas prácticas cadenas de ca­ra­c­te­res. En el tutorial a co­n­ti­nua­ción, mostramos las diversas opciones y trucos si­n­tá­c­ti­cos usando ejemplos de ex­pre­sio­nes regulares, tanto en ex­pre­sio­nes sencillas como en ex­pre­sio­nes complejas.

Ex­pre­sio­nes regulares de un elemento

La forma regex más sencilla es un patrón de búsqueda que tan solo prevé un único elemento como resultado. Este tipo de expresión regular de un elemento puede, por ejemplo, definirse sin problemas usando una clase de ca­ra­c­te­res, siempre y cuando no se esté buscando un elemento concreto. La siguiente expresión permite op­cio­na­l­me­n­te los dígitos “1”, “2”, “3”, “4”, “5”, “6” o “7” como posible resultado:

[1234567]

En este caso, los números son di­re­c­ta­me­n­te co­n­se­cu­ti­vos, por lo que también se permite la siguiente grafía si­m­pli­fi­ca­da:

[1-7]

En caso de que la expresión regular deba mo­di­fi­car­se para excluir de la búsqueda el dígito “4”, también se puede utilizar la variante más simple con el signo menos:

[1-35-7]
Nota

Los ca­ra­c­te­res de un patrón regex no se separan con espacios.

Ex­pre­sio­nes regulares de varios elementos

En el caso de las ex­pre­sio­nes regulares de varios elementos, también se puede trabajar con clases de ca­ra­c­te­res para permitir re­su­l­ta­dos di­fe­re­n­tes. Si la expresión tiene que incluir, por ejemplo, dos elementos para los que se pueden esperar di­fe­re­n­tes re­su­l­ta­dos, entonces basta con colocar dos clases de ca­ra­c­te­res una después de la otra:

[1-7][a-c]

Como primer elemento, ha de aparecer un número de entre el “1” y el “7”, seguido de una letra “a”, “b” o “c”. Re­co­r­da­mos que aquí las mi­nú­s­cu­las son obli­ga­to­rias. Sin pro­fu­n­di­zar en los mo­di­fi­ca­do­res, con este pequeño ajuste de la expresión puedes incluir las ma­yú­s­cu­las:

[1-7][a-cA-C]

Ex­pre­sio­nes regulares con elementos op­cio­na­les

Al margen de si se buscan varios elementos en una única expresión regular o con ayuda de varios grupos de ca­ra­c­te­res, es posible que de­te­r­mi­na­dos elementos solo se deban o puedan incluir en de­te­r­mi­na­das co­n­di­cio­nes. Este puede ser, por ejemplo, el caso de una expresión regular que debe filtrar todos los números de casa de las di­re­c­cio­nes. En los casos en los que el número de casa sea un único dígito, puede coincidir con algunos re­su­l­ta­dos en los que el número está compuesto por dos o incluso tres dígitos. Además, hay di­re­c­cio­nes en las que el número de casa incluye también una letra. Para abarcar todas estas posibles co­m­bi­na­cio­nes, puedes usar las si­guie­n­tes in­s­tru­c­cio­nes regex:

[1-9][0-9]?[0-9]?[a-z]?

El único elemento obli­ga­to­rio de este patrón de búsqueda es un número del “1” al “9”. Pueden estar seguidos op­cio­na­l­me­n­te tanto por dos dígitos del “0” al “9”, como por una letra cua­l­quie­ra. Todas las opciones posibles se marcan con el signo de in­te­rro­ga­ción visto arriba.

Aunque la co­n­s­tru­c­ción de números de tres dígitos con letras adi­cio­na­les resulta bastante clara, los números de hasta diez dígitos tienen un aspecto bastante diferente. En este caso re­co­me­n­da­mos utilizar las llaves tal y como se muestra en la siguiente expresión regular:

[1-9][0-9]{0,9}

Al igual que en el ejemplo anterior, en primer lugar, se requiere un número del “1” al “9” que puede estar seguido de ninguno o de hasta nueve dígitos del “0” al “9”, de modo que el resultado de la búsqueda pueda estar formado por hasta diez dígitos.

Expresión regular con una cantidad aleatoria de re­pe­ti­cio­nes

En los ejemplos vistos hasta ahora para ex­pre­sio­nes de uno o varios elementos, se conocían las ca­n­ti­da­des mínima y máxima de ca­ra­c­te­res. Sin embargo, hay otros es­ce­na­rios en los que no se puede de­te­r­mi­nar de antemano con exactitud la cantidad de ca­ra­c­te­res de una regex. Los pa­rá­me­tros ne­ce­sa­rios son el asterisco (*) y el signo más (+), los cuales permiten una cantidad cua­l­quie­ra de re­pe­ti­cio­nes de un carácter, una clase o grupos de ca­ra­c­te­res. Se pueden registrar todas las cadenas de ca­ra­c­te­res que tengan una cantidad cua­l­quie­ra de dígitos (también “cero”), por ejemplo, con la siguiente expresión regular:

[0-9]*

Esto también es válido para la búsqueda de una co­m­bi­na­ción concreta de ca­ra­c­te­res en la que uno (o varios) ca­ra­c­te­res pueden aparecer con una fre­cue­n­cia cua­l­quie­ra, tal y como se muestra en el siguiente ejemplo:

ab*

En este caso, los re­su­l­ta­dos son las palabras “arrancar” y también “abrir”. En caso de que se deba ignorar el primer resultado o si el carácter es­pe­ci­fi­ca­do debe aparecer como mínimo una vez, entonces debe uti­li­zar­se el signo más:

ab+

Negar clases de ca­ra­c­te­res

Si se desean utilizar ex­pre­sio­nes regulares con clases de ca­ra­c­te­res que equivalen a uno o varios ca­ra­c­te­res, pero al mismo tiempo se desea descartar como resultado a uno o varios ca­ra­c­te­res de­te­r­mi­na­dos, entonces se necesita utilizar la negación “^” (acento ci­r­cu­n­fle­jo). Este signo se sitúa siempre dentro de los corchetes de una clase de ca­ra­c­te­res, por lo que su validez se limita a los mismos. La siguiente in­s­tru­c­ción es un buen ejemplo de una clase de ca­ra­c­te­res en negación:

c[^o]sa

En este caso, el segundo carácter puede ser un carácter cua­l­quie­ra excepto “o”, por lo que la palabra “casa” cumple con los criterios de coin­ci­de­n­cia. Sin embargo, la palabra “cosa” no lo cumple.

Marcador de posición

Las ex­pre­sio­nes regulares también permiten trabajar con ma­r­ca­do­res de posición, los cuales equivalen a uno, varios o incluso ningún carácter (de­pe­n­die­n­do del me­ta­ca­rá­c­ter utilizado) dentro de un patrón de búsqueda. El marcador de posición se genera mediante un punto combinado con el carácter especial citado antes para re­pe­ti­cio­nes, siempre y cuando se desee obtener un resultado de más de un único carácter. Este tipo de ex­pre­sio­nes regulares permite, por ejemplo, buscar en una base de datos a una persona que, aunque se conoce por su nombre y apellidos, no se tiene la certeza de si se ha in­tro­du­ci­do in­clu­ye­n­do un segundo nombre:

Juan.*Apellido

En este caso, los re­su­l­ta­dos pueden ser tanto “Juan Antonio Apellido” (o cualquier otra co­m­bi­na­ción de segundo nombre) como “Juan A. Apellido” o “Juan Apellido”. Si solo deben tenerse en cuenta las variantes con un segundo nombre, entonces deberá uti­li­zar­se un signo más en lugar del asterisco:

Juan.+Apellido

Un buen ejemplo de uso práctico de un marcador de posición para un único carácter es el siguiente patrón de búsqueda, en el que las coin­ci­de­n­cias pueden ser tanto “casa” como “cosa”:

c.sa

Al­te­r­na­ti­vas

Las ex­pre­sio­nes regulares también pueden fo­r­mu­lar­se de tal manera que se ofrezcan dos o más coin­ci­de­n­cias al­te­r­na­ti­vas. La al­te­r­na­ti­va tiene validez usando como se­pa­ra­ción una barra vertical, tal y como se muestra en el siguiente ejemplo:

casa|cosa

En este caso, tanto “casa” como “cosa” ofrecerán una coin­ci­de­n­cia.

Las al­te­r­na­ti­vas también pueden fo­r­mu­lar­se dentro de palabras o se­cue­n­cias de ca­ra­c­te­res mediante el uso de grupos:

(Lun|Mart|Miércol|Juev|Viern)es|Sábado|Domingo

En este ejemplo, cada uno de los días de la semana pueden ser un resultado pues, gracias a la agru­pa­ción mediante pa­ré­n­te­sis, todos los días de la semana que acaban en “es” se registran co­rre­c­ta­me­n­te, incluso si se usan de forma abreviada.

Grupos

Los grupos de ca­ra­c­te­res, como los del apartado anterior, son co­n­si­de­ra­dos clases de ca­ra­c­te­res por los elementos es­tru­c­tu­ra­les de las ex­pre­sio­nes regulares. Pueden definirse con un par de pa­ré­n­te­sis y equivalen bá­si­ca­me­n­te a un patrón compuesto por uno o varios ca­ra­c­te­res. En el sentido estricto de la palabra, cada regex es un grupo, pero en este caso se obvia la ca­ra­c­te­ri­za­ción mediante pa­ré­n­te­sis. Dentro de las ex­pre­sio­nes, los grupos permiten aplicar ope­ra­do­res tales como el de­li­mi­ta­dor o el signo de re­pe­ti­ción (signo más o asterisco) en una expresión parcial es­pe­cí­fi­ca:

ab(cd)+

En este caso, la re­pe­ti­ción aleatoria que se busca también será válida para el grupo de ca­ra­c­te­res “cd” pero, si se prescinde de los pa­ré­n­te­sis, solo será válida para “d”. Dentro de una regex no hay límites para la cantidad de grupos incluidos.

Ani­da­mie­n­tos

Una expresión regular no solo puede albergar una cantidad cua­l­quie­ra de grupos, sino que también permite anidar tantos grupos como se desee para expresar de­sig­na­cio­nes complejas entre ca­ra­c­te­res in­di­vi­dua­les y ca­ra­c­te­res es­pe­cia­les sin necesidad de usar cadenas de ca­ra­c­te­res ex­ce­si­va­me­n­te largas. Un ejemplo es el siguiente patrón regex, con el cual se pueden obtener como posible resultado los cuatro modelos de automóvil “VW Golf”, “VW Polo”, “Fiat Punto” o “Fiat Panda”:

(VW (Golf|Polo)|Fiat (Punto|Panda))

Límite de palabra

Cuando, al aplicar una expresión regular, deban tenerse en cuenta los límites de palabra, esto es, el inicio o el final de una secuencia al­fa­nu­mé­ri­ca, entonces se deberán es­pe­ci­fi­car mediante el uso de me­ta­ca­ra­c­te­res. Muchos lenguajes utilizan para esto la co­m­bi­na­ción “\b”, la cual se puede anteponer, agregar o posponer al patrón de búsqueda.

La primera variante determina que la secuencia de búsqueda esté al principio de la palabra:

\bcaso

Una coin­ci­de­n­cia para esta expresión regular es, por ejemplo, la palabra “casona”. Por el contrario, la palabra “acaso” se excluye de los re­su­l­ta­dos debido a que el carácter que se ha buscado tiene delante la letra “a”. Para el caso contrario, se puede utilizar la segunda variante y agregar el carácter especial:

caso\b

Con la tercera opción, ambos límites de palabra se co­n­vie­r­ten en requisito im­pre­s­ci­n­di­ble; en el caso del ejemplo utilizado, el único resultado posible es la palabra “caso”:

\bcaso\b

Quitar me­ta­si­g­ni­fi­ca­do de ca­ra­c­te­res es­pe­cia­les

En el apartado anterior, la barra diagonal inversa garantiza que la “b” colocada después no se va a utilizar como letra, sino como me­ta­ca­rá­c­ter. Si se combina con ca­ra­c­te­res co­n­si­de­ra­dos por defecto como uno de los ca­ra­c­te­res es­pe­cia­les si­n­tá­c­ti­cos regex, entonces tendrá exac­ta­me­n­te el efecto opuesto: el carácter se co­n­si­de­ra­rá como un literal común. Gracias a esta opción, también se puede buscar sin problemas una fecha concreta usando una expresión regular:

11\.10\.2019

En este caso, la fecha “11.10.2019” es la única cadena de ca­ra­c­te­res que coincide con los criterios de búsqueda es­pe­ci­fi­ca­dos. Si no se coloca la barra diagonal inversa, los dos puntos se co­n­si­de­ra­rían ma­r­ca­do­res de posición para un carácter cua­l­quie­ra, por lo que también se ofre­ce­rían re­su­l­ta­dos del tipo “1101092019” o “11a10b2019”.

“Moderar” ex­pre­sio­nes regulares am­bi­cio­sas

El uso de cua­n­ti­fi­ca­do­res (“?”, “+”, “*”, “{}”) garantiza por defecto que una expresión sea “ambiciosa” y que, por tanto, busque la mayor coin­ci­de­n­cia posible. Como este co­m­po­r­ta­mie­n­to no siempre es deseable, los cua­n­ti­fi­ca­do­res se pueden es­pe­ci­fi­car en una expresión regular de tal manera que se modere esa “ambición”. Este proceso de mo­di­fi­ca­ción se muestra cla­ra­me­n­te en el siguiente ejemplo:

A.*B

Si se aplica en la secuencia de ca­ra­c­te­res “ABCDEB”, esta expresión no para la búsqueda tras “AB”, sino que engloba como resultado toda la secuencia de ca­ra­c­te­res. Si, por el contrario, la búsqueda se debe cancelar justo tras la primera “B”, entonces se necesita la mo­di­fi­ca­ción indicada. Para ello, en muchas de las lenguas (entre otras Perl, Tcl, HTML) se coloca detrás una marca de in­te­rro­ga­ción:

A.*?B

Como al­te­r­na­ti­va, la expresión original también se puede sustituir por la siguiente expresión equi­va­le­n­te y “no ambiciosa”, para así obtener el mismo resultado:

A[^B]*B
Nota

La li­mi­ta­ción de ex­pre­sio­nes regulares am­bi­cio­sas complica el pro­ce­sa­mie­n­to del patrón de búsqueda, por lo que está vinculado a un tiempo de búsqueda más largo.

Ir al menú principal