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)ipara dejar de fumar . qcoincide con q y el grupo de captura ucoincide 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 icoincidirá con i . Este último intento de coincidencia tiene éxito. qui se empareja y se crea un grupo de captura con u .
Solicitemos q(?:u)ipara dejar de fumar . Nuevamente, qcoincide con q y el grupo que no captura ucoincide 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 icoincidirá con i . Este último intento de coincidencia tiene éxito. qui está emparejado
Solicitemos q(?=u)ipara dejar de fumar . La anticipación es positiva y va seguida de otra ficha. Nuevamente, qcoincide con q y ucoincide con u . Nuevamente, la coincidencia de la búsqueda anticipada debe descartarse, por lo que el motor retrocede desde ila cadena hacia u . La búsqueda anticipada se realizó correctamente, por lo que el motor continúa con i. Pero ino puede coincidir con u . Entonces este intento de partido falla.
Solicitemos q(?=u)upara dejar de fumar . La anticipación es positiva y va seguida de otra ficha. Nuevamente, qcoincide con q y ucoincide con u . La coincidencia de la búsqueda anticipada debe descartarse, por lo que el motor retrocede desde ula cadena hacia u . La búsqueda anticipada se realizó correctamente, por lo que el motor continúa con u. Y ucoincidirá con usted . Entonces este intento de emparejamiento es exitoso. qu está emparejado
Solicitemos q(?!i)upara dejar de fumar . Incluso en este caso, la búsqueda anticipada es positiva (porque ino coincide) y va seguida de otro token. Nuevamente, qcoincide con q y ino coincide con u . La coincidencia de la búsqueda anticipada debe descartarse, por lo que el motor retrocede desde ula cadena hacia u . La búsqueda anticipada se realizó correctamente, por lo que el motor continúa con u. Y ucoincidirá 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.