Para comprender mejor, apliquemos las tres expresiones más un grupo de captura y analicemos cada comportamiento.
()
grupo de captura : la expresión regular dentro del paréntesis debe coincidir y la coincidencia debe crear un grupo de captura
(?:)
grupo sin captura : la expresión regular dentro del paréntesis debe coincidir pero no crea el grupo de captura
(?=)
mirada positiva hacia el futuro : afirma que la expresión regular debe coincidir
(?!)
mirada negativa hacia adelante : afirma que es imposible hacer coincidir la expresión regular
Solicitemos q(u)i
para dejar de fumar . q
coincide con q y el grupo de captura u
coincide con u . Se toma la coincidencia dentro del grupo de captura y se crea un grupo de captura. Entonces el motor continúa con i
. Y i
coincidirá con i . Este último intento de coincidencia tiene éxito. qui se empareja y se crea un grupo de captura con u .
Solicitemos q(?:u)i
para dejar de fumar . Nuevamente, q
coincide con q y el grupo que no captura u
coincide con u . Se toma la coincidencia del grupo de no captura, pero no se crea el grupo de captura. Entonces el motor continúa con i
. Y i
coincidirá con i . Este último intento de coincidencia tiene éxito. qui está emparejado
Solicitemos q(?=u)i
para dejar de fumar . La anticipación es positiva y va seguida de otra ficha. Nuevamente, q
coincide con q y u
coincide con u . Nuevamente, la coincidencia de la búsqueda anticipada debe descartarse, por lo que el motor retrocede desde i
la cadena hacia u . La búsqueda anticipada se realizó correctamente, por lo que el motor continúa con i
. Pero i
no puede coincidir con u . Entonces este intento de partido falla.
Solicitemos q(?=u)u
para dejar de fumar . La anticipación es positiva y va seguida de otra ficha. Nuevamente, q
coincide con q y u
coincide con u . La coincidencia de la búsqueda anticipada debe descartarse, por lo que el motor retrocede desde u
la cadena hacia u . La búsqueda anticipada se realizó correctamente, por lo que el motor continúa con u
. Y u
coincidirá con usted . Entonces este intento de emparejamiento es exitoso. qu está emparejado
Solicitemos q(?!i)u
para dejar de fumar . Incluso en este caso, la búsqueda anticipada es positiva (porque i
no coincide) y va seguida de otro token. Nuevamente, q
coincide con q y i
no coincide con u . La coincidencia de la búsqueda anticipada debe descartarse, por lo que el motor retrocede desde u
la cadena hacia u . La búsqueda anticipada se realizó correctamente, por lo que el motor continúa con u
. Y u
coincidirá con usted . Entonces este intento de emparejamiento es exitoso. qu está emparejado
Entonces, en conclusión, la diferencia real entre los grupos de búsqueda anticipada y los que no capturan se trata de si solo desea probar la existencia o probar y guardar la coincidencia. Los grupos de captura son costosos, así que úselo con prudencia.