En esta lección, exploraremos características adicionales y diferentes tipos de agrupación.
Agrupación con retroceso
Tenemos un grupo de caracteres del cual seleccionamos ta o tu:
/(ta|tu)/
ta-tu ta-ta tu-tu
Supongamos que queremos encontrar solo las subcadenas en las que la parte izquierda y la parte derecha sean iguales: ta - ta y tu - tu. Intentemos agregar otra condición "o" a nuestra expresión y veamos que no podemos lograrlo:
/(ta|tu)-(ta|tu)/
ta-tu ta-ta tu-tu
Aquí es donde la agrupación con retroceso nos ayuda. Para hacer esto, usamos el marcador especial \1, que indica que los caracteres del primer grupo deben ser reemplazados por \1.
De esta manera, las subcadenas con partes izquierdas y derechas iguales coinciden:
/(ta|tu)-\1/
ta-tu ta-ta tu-tu
Por defecto, todos los grupos de caracteres creados se almacenan en un área de memoria especial y se marcan con los caracteres de \1 a \9. Si usamos cuantificadores, no afectará el resultado. Esto se debe a que los cuantificadores no participan en el retroceso, solo se toma la primera coincidencia en el área de memoria:
/(ta|tu)+-\1/
ta-tu ta-ta tu-tu
Grupos con nombres
Si usamos varios grupos, puede resultar incómodo recordarlos por números. Es mucho más conveniente usar nombres. Para hacer esto, agregamos ?<name> después de abrir el paréntesis:
/(?<group1>ta|tu)-\k<group1>/
ta-tu ta-ta tu-tu
Ahora es más conveniente trabajar con el grupo en nuestro código, ya que podemos hacer referencia a él por su nombre group1.
El símbolo k se utiliza para hacer referencia inversa a un grupo con nombre. En este caso, \k<group1> significa hacer referencia inversa al grupo con el nombre group1. Esto significa que después del guión debe haber el mismo valor que en el grupo group1.
Agrupación sin retroceso
Podemos desactivar el retroceso colocando ?: dentro de nuestro grupo:
/(?:ta|tu)-\1/
ta-tu ta-ta tu-tu
Después de esto, el grupo ya no se guarda en un área de memoria especial. Al llamarlo, se producirá un error porque ese grupo no existe en la memoria. Con este enfoque, la expresión regular se vuelve difícil de leer, pero funciona más rápido.
Este es un método completamente funcional. Es especialmente útil si no desea que los grupos adicionales ocupen mucho espacio y dificulten la agrupación adicional.
Agrupación atómica
Otro tipo interesante de agrupación sin retroceso es la agrupación atómica. La agrupación atómica no es compatible con algunos lenguajes de programación populares, como JavaScript y Python. Sin embargo, se pueden encontrar soluciones para emularla utilizando las construcciones disponibles.
Para la agrupación atómica, en lugar de : se utiliza el símbolo >:
/a(?>bc|b|x)cc/
abcc axcc abcc
Cuando agregamos los caracteres de agrupación atómica ?>, ocurre lo siguiente:
- Primero se encuentra el carácter
a - Luego,
bc - Luego, se busca
cc
Veamos cómo funciona. Si eliminamos los caracteres ?>, la expresión regular encuentra tres subcadenas: abcc, axcc y abcc:
/a(bc|b|x)cc/
abcc axcc abcc
Consideremos este ejemplo con más detalle. En el caso normal, la búsqueda retrocedería a a y continuaría verificando con b, porque hay un símbolo de alternativa |. Luego llegaríamos a cc y la verificación sería exitosa.
Con la agrupación atómica, el retroceso a la cadena hasta el símbolo a se desactiva. Se continúa con las alternativas bc -> b -> x, y luego se realiza la coincidencia con cc.
Cuando se encuentra la primera coincidencia de un grupo atómico (?>bc|b|x), no se consideran otras opciones de ese grupo. Luego, se continúa la búsqueda desde el siguiente carácter de la cadena analizada, comenzando desde el primer carácter de la expresión regular.
Podríamos encontrar una coincidencia con la subcadena con agrupación atómica solo si agregamos otro carácter c a abcc:
/a(?>bc|b|x)cc/
abccc axcc abcc
Con esta agrupación, la búsqueda se detiene después de que se hayan probado todas las alternativas del grupo.
El algoritmo detallado se puede describir de la siguiente manera:
- La búsqueda comienza desde el primer carácter de la cadena analizada.
- Si se encuentra una coincidencia antes de un grupo atómico, se realizan sustituciones secuenciales de las opciones.
- Cuando se encuentra la primera coincidencia, se detiene la iteración de las opciones y se continúa la búsqueda de caracteres después del grupo atómico.
- Si la coincidencia con la expresión regular es incompleta, la búsqueda se detiene. Esto no depende de si se han probado otras opciones del grupo.
- La búsqueda posterior en la cadena se realiza nuevamente para toda la expresión regular, pero comenzando desde el siguiente carácter en la cadena analizada.
Para acceder completo a curso necesitas un plan básico
El plan básico te dará acceso completo a todos los cursos, ejercicios y lecciones de Códica, proyectos y acceso de por vida a la teoría de las lecciones completadas. La suscripción se puede cancelar en cualquier momento.