Cuantificadores de expresión regular
Construcciones de cuantificador
Los cuantificadores especifican la frecuencia con la que debe coincidir la construcción de expresión regular anterior. Las clases de cuantificadores son:
- Codicioso
- Reacio
- Posesivo
La diferencia entre los cuantificadores codiciosos, reacios y posesivos radica en qué parte de la cadena intentar para la coincidencia inicial y cómo volver a intentarlo si el intento inicial no produce una coincidencia.
Por defecto, los cuantificadores son
greedy
. Un cuantificador voraz primero intenta encontrar una coincidencia con toda la cadena de entrada. Si se produce una coincidencia, se considera que la coincidencia es correcta y el motor puede pasar a la siguiente construcción de la expresión regular. Si el primer intento no produce una coincidencia, el motor retrocede un carácter a la vez hasta que encuentra una coincidencia. Por lo tanto, un cuantificador voraz comprueba las posibles coincidencias en orden desde la cadena de entrada más larga posible hasta la cadena de entrada más corta posible, intentando recursivamente de derecha a izquierda.Añadir un
?
(signo de interrogación) a un cuantificador voraz lo hace reacio
. Un cuantificador reacio primero intenta encontrar una coincidencia desde el principio de la cadena de entrada, comenzando con la parte más corta posible de la cadena que coincida con la construcción de expresión regular. Si se produce una coincidencia, se considera que la coincidencia es correcta y el motor puede pasar a la siguiente construcción de la expresión regular. Si el primer intento no produce una coincidencia, el motor añade un carácter a la vez hasta que encuentra una coincidencia. Por lo tanto, un cuantificador reacio comprueba las posibles coincidencias en orden desde la cadena de entrada más corta posible hasta la cadena de entrada más larga posible, intentando recursivamente de izquierda a derecha. Añadir un
+
(signo más) a un cuantificador voraz lo convierte en posesivo
. Un cuantificador posesivo es como un cuantificador voraz en el primer intento (intenta una coincidencia con toda la cadena de entrada). La diferencia es que, a diferencia de un cuantificador voraz, un cuantificador posesivo no vuelve a intentarlo con una cadena más corta si no encuentra una coincidencia. Si la coincidencia inicial falla, el cuantificador posesivo informa de una coincidencia fallida. No realiza más intentos.Constructo codicioso | Constructo reacio | Constructo posesivo | Descripción | Ejemplo |
|---|---|---|---|---|
?
| ??
| ?+
| Coincide con el carácter o la construcción anterior una vez o no coincide. | st?on coincide con "son" en "johnson" y "ston" en "johnston", pero no en "clinton" ni en "version" |
*
| *?
| *+
| Coincide con el carácter o la construcción anterior cero o más veces. | if* coincide con "if", "iff" en "diff" o "i" en "print" |
+
| +?
| ++
| Coincide con el carácter o la construcción anterior una o más veces. | if+ coincide con "if", "iff" en "diff", pero nada en "print" |
{n}
| {n}?
| {n}+
| Coincide con el carácter o la estructura anterior exactamente n veces. | o{2} coincide con "oo" en "lookup" y las dos primeras ceros en "fooooo", pero no en "mount" |
{n,}
| {n,}?
| {n,}+
| Coincide con el carácter o la construcción anterior al menos n veces. | o{2,} coincide con "oo" en "lookup" las 5 o en "fooooo" pero nada en "mount" |
{n,m}
| {n,m}?
| {n,m}+
| Coincide con el carácter o la construcción anterior al menos n veces, pero no más de m veces. | F{2,4} coincide con "FF" en "#FF0000" y las últimas 4 F en "#FFFFFF" |