Regular Expressions
Agrupación atómica
Buscar..
Introducción
Los grupos regulares que no capturan permiten que el motor vuelva a ingresar al grupo e intente hacer coincidir algo diferente (como una alternancia diferente, o hacer coincidir menos caracteres cuando se usa un cuantificador).
Los grupos atómicos difieren de los grupos regulares que no capturan, ya que está prohibido el retroceso. Una vez que el grupo sale, toda la información de seguimiento se descarta, por lo que no se pueden intentar coincidencias alternativas.
Observaciones
Un cuantificador posesivo se comporta como un grupo atómico en el sentido de que el motor no podrá retroceder sobre un token o grupo.
Los siguientes son equivalentes en términos de funcionalidad, aunque algunos serán más rápidos que otros:
a*+abc
(?>a*)abc
(?:a+)*+abc
(?:a)*+abc
(?:a*)*+abc
(?:a*)++abc
Agrupando con (?>)
Usando un grupo atómico
Los grupos atómicos tienen el formato (?>...)
con un ?>
Después del parén abierto.
Considere el siguiente texto de muestra:
ABC
La expresión regular intentará coincidir comenzando en la posición 0 del texto, que está antes de la A
en ABC
.
Si se utilizara (?>a*)abc
expresión insensible a mayúsculas (?>a*)abc
, (?>a*)
coincidiría con 1 carácter A
, dejando
BC
como el texto restante para que coincida. Se sale del grupo (?>a*)
y se intenta abc
en el texto restante, que no coincide.
El motor no puede retroceder en el grupo atómico, por lo que el paso actual falla. El motor se mueve a la siguiente posición en el texto, que estaría en la posición 1, que está después de la A
y antes de la B
de ABC
.
La expresión regular (?>a*)abc
se intenta de nuevo, y (?>a*)
coincide con A
0 veces, dejando
BC
como el texto restante para que coincida. Se sale del grupo (?>a*)
y se intenta abc
, que falla.
Nuevamente, el motor no puede retroceder en el grupo atómico, por lo que el paso actual falla. La expresión regular continuará fallando hasta que todas las posiciones en el texto se hayan agotado.
Usando un grupo no atómico
Los grupos regulares que no capturan tienen el formato (?:...)
con un ?:
Después del parén abierto.
Dado el mismo texto de ejemplo, pero con la expresión que no distingue entre mayúsculas y minúsculas (?:a*)abc
, se producirá una coincidencia, ya que se permite que se produzca un retroceso.
Al principio, (?:a*)
consumirá la letra A
en el texto
ABC
dejando
BC
como el texto restante para que coincida. Se sale del grupo (?:a*)
y se intenta abc
en el texto restante, que no coincide.
El motor retrocede al grupo (?:a*)
e intenta hacer coincidir 1 carácter menos: en lugar de hacer coincidir el carácter de 1 A
, intenta hacer coincidir los caracteres de 0 A
, y se abandona el grupo (?:a*)
. Esto deja
ABC
como el texto restante para que coincida. El regex abc
ahora puede coincidir exitosamente con el texto restante.
Otro ejemplo de texto
Considere este texto de ejemplo, con grupos atómicos y no atómicos (de nuevo, sin distinción de mayúsculas y minúsculas):
AAAABC
La expresión regular intentará coincidir comenzando en la posición 0 del texto, que está antes de la primera A
en AAAABC
.
El patrón que usa el grupo atómico (?>a*)abc
no podrá coincidir, se comportará de manera casi idéntica al ejemplo ABC
atómico anterior: los 4 caracteres A
primero se comparan con (?>a*)
(dejando a BC
como el texto restante para coincidir), y abc
no puede coincidir en ese texto. El grupo no puede volver a ingresarse, por lo que la coincidencia falla.
El patrón que usa el grupo no atómico (?:a*)abc
podrá coincidir, comportándose de manera similar al ejemplo ABC
no atómico anterior: todos los 4 caracteres A
se comparan primero con (?:a*)
(dejando BC
como el texto restante para coincidir), y abc
no puede coincidir en ese texto. El grupo es capaz de volver a introducir, por lo que uno menos A
se intenta: 3 A
los personajes se emparejan en lugar de 4 (dejando ABC
como el resto del texto para que coincida), y abc
es capaz de igualar con éxito en ese texto.