Regístrate para acceder a más de 15 cursos gratuitos de programación con un simulador

Agrupación. Retroalimentación Expresiones regulares (Regexp)

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:

  1. La búsqueda comienza desde el primer carácter de la cadena analizada.
  2. Si se encuentra una coincidencia antes de un grupo atómico, se realizan sustituciones secuenciales de las opciones.
  3. 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.
  4. 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.
  5. 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.

Obtener acceso
130
cursos
1000
ejercicios
2000+
horas de teoría
3200
test

Obtén acceso

Cursos de programación para principiantes y desarrolladores experimentados. Comienza tu aprendizaje de forma gratuita

  • 130 cursos, 2000+ horas de teoría
  • 1000 ejercicios prácticos en el navegador
  • 360 000 estudiantes
Al enviar el formulario, aceptas el «Política de privacidad» y los términos de la «Oferta», y también aceptas los «Términos y condiciones de uso»

Nuestros graduados trabajan en empresas como:

Bookmate
Health Samurai
Dualboot
ABBYY