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.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow