Busqué el significado de estas expresiones pero no pude entender la diferencia exacta entre ellas. Esto es lo que ellos dicen:
?:
Haga coincidir la expresión pero no la capture.?=
Coincidir con un sufijo pero excluirlo de la captura.?!
Coincidir si el sufijo está ausente.
Intenté usarlos en RegEx simple y obtuve resultados similares para todos. ejemplo: las siguientes 3 expresiones dan resultados muy similares.
[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+(?!\.[a-zA-Z0-9]+)*
[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+(?=\.[a-zA-Z0-9]+)*
[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9]+)*
javascript
regex
RK Poddar
fuente
fuente
*
después de los grupos, por lo que simplemente se ignoran.Respuestas:
La diferencia entre
?=
y?!
es que el primero requiere que la expresión dada coincida y el segundo requiere que no coincida. Por ejemploa(?=b)
, coincidirá con la "a" en "ab", pero no con la "a" en "ac". Considerandoa(?!b)
que coincidirá con la "a" en "ac", pero no con la "a" en "ab".La diferencia entre
?:
y?=
es que?=
excluye la expresión de toda la coincidencia, mientras que?:
simplemente no crea un grupo de captura. Entonces, por ejemploa(?:b)
, coincidirá con "ab" en "abc", mientrasa(?=b)
que solo coincidirá con "a" en "abc".a(b)
coincidiría con la "ab" en "abc" y crearía una captura que contenga la "b".fuente
Consulte aquí: http://www.regular-expressions.info/lookaround.html para obtener muy buenos tutoriales y ejemplos de anticipación en expresiones regulares.
fuente
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 regularSolicitemos
q(u)i
para dejar de fumar .q
coincide con q y el grupo de capturau
coincide con u . Se toma la coincidencia dentro del grupo de captura y se crea un grupo de captura. Entonces el motor continúa coni
. Yi
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 capturau
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 coni
. Yi
coincidirá con i . Este último intento de coincidencia tiene éxito. qui está emparejadoSolicitemos
q(?=u)i
para dejar de fumar . La anticipación es positiva y va seguida de otra ficha. Nuevamente,q
coincide con q yu
coincide con u . Nuevamente, la coincidencia de la búsqueda anticipada debe descartarse, por lo que el motor retrocede desdei
la cadena hacia u . La búsqueda anticipada se realizó correctamente, por lo que el motor continúa coni
. Peroi
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 yu
coincide con u . La coincidencia de la búsqueda anticipada debe descartarse, por lo que el motor retrocede desdeu
la cadena hacia u . La búsqueda anticipada se realizó correctamente, por lo que el motor continúa conu
. Yu
coincidirá con usted . Entonces este intento de emparejamiento es exitoso. qu está emparejadoSolicitemos
q(?!i)u
para dejar de fumar . Incluso en este caso, la búsqueda anticipada es positiva (porquei
no coincide) y va seguida de otro token. Nuevamente,q
coincide con q yi
no coincide con u . La coincidencia de la búsqueda anticipada debe descartarse, por lo que el motor retrocede desdeu
la cadena hacia u . La búsqueda anticipada se realizó correctamente, por lo que el motor continúa conu
. Yu
coincidirá con usted . Entonces este intento de emparejamiento es exitoso. qu está emparejadoEntonces, 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.
fuente
Intente hacer coincidir
foobar
con estos:La primera expresión regular coincidirá y devolverá "barra" como primera subcoincidencia -
(?=b)
coincide con la 'b', pero no la consume, dejándola para los siguientes paréntesis.La segunda expresión regular NO coincidirá, porque espera que "foo" sea seguido por algo diferente de 'b'.
(?:...)
tiene exactamente el mismo efecto que simple(...)
, pero no devuelve esa parte como subcoincidencia.fuente
La forma más sencilla de entender las afirmaciones es tratarlas como el comando insertado en una expresión regular. Cuando el motor funciona a una afirmación, verificará inmediatamente la condición descrita por la afirmación. Si el resultado es verdadero, continúe ejecutando la expresión regular.
fuente
Esta es la verdadera diferencia:
Si no le importa el contenido después de "?:" O "? =", "?:" Y "? =" Son iguales. Ambos están bien para usar.
Pero si necesita ese contenido para un proceso posterior (no solo para que coincida con todo. En ese caso, simplemente puede usar "a (b)") Tiene que usar "? =" En su lugar. Porque "?:" Simplemente lo superará.
fuente