php - regular - RegEx BackReference para hacer coincidir diferentes valores
regex optional group (2)
¿En qué idioma / aplicación utiliza esta expresión regular? Si tiene la opción, puede especificar las diferentes partes como variables con nombre y luego construir la expresión regular final combinándolas.
val = "([a-zA-Z]+[0-9]*|[0-9]+|/'.*/'|/[.*/])"
op = "(ni|in|/*|//|/+|/-|==|!=|>|>=|<|<=)"
exp = "(/(" .. val .. "/s*" .. op .. "/s*" .. val .. "/))"
Tengo una expresión regular que utilizo para coincidir con la expresión del formulario
(val1 operator val2)
Esta expresión regular se parece a:
(/(/s*([a-zA-Z]+[0-9]*|[0-9]+|/'.*/'|/[.*/])/s*(ni|in|/*|//|/+|/-|==|!=|>|>=|<|<=)/s*([a-zA-Z]+[0-9]*|[0-9]+|/'.*/'|/[.*/])/s*/))
Lo cual es realmente bueno y coincide con lo que quiero como puedes ver aquí en esta demostración
PERO: D (aquí viene la mantequilla)
Quiero optimizar la expresión regular en sí misma haciéndola más legible y "compacta". Busqué cómo hacerlo y encontré algo llamado referencia inversa, en el que puede nombrar sus grupos de captura y luego hacer referencia a ellos más adelante como tal:
(/(/s*(?P<Val>[a-zA-Z]+[0-9]*|[0-9]+|/'.*/'|/[.*/])/s*(ni|in|/*|//|/+|/-|==|!=|>|>=|<|<=)/s*(/g{Val})/s*/))
donde nombré el grupo que captura el lado izquierdo de la expresión
Val
y luego lo mencioné como
(/g{Val})
, ahora el
problema
es que esta expresión, como puede ver
here
solo es un caso donde el lado izquierdo de la expresión es exactamente ¡Lo mismo que el lado derecho!
por ejemplo
(a==a)
o
(1==1)
y no coincide con expresiones como
(a==b)
!
Ahora la pregunta es: ¿hay alguna manera de hacer referencia al patrón en lugar del valor coincidente?
Tenga en cuenta que
/g{N}
es equivalente a
/1
, es decir, una
referencia inversa
que coincide con el mismo
valor
, no con el patrón, con el que coincidió el grupo de captura correspondiente.
Sin embargo, esta sintaxis es un poco más flexible, ya que puede definir los grupos de captura que son
relativos
al grupo actual usando
-
antes del número (es decir,
/g{-2}
,
(/p{L})(/d)/g{-2}
coincidirá con
a1a
).
El motor PCRE permite que
las llamadas de subrutina se
repitan subpatrones.
Para repetir el patrón del Grupo 1, use
(?1)
y
(?&Val)
para repetir el patrón del grupo nombrado
Val
.
Además, puede usar clases de caracteres para unir caracteres individuales y considerar usar
?
cuantificador para hacer que partes de la expresión regular sean opcionales:
(/(/s*(?P<Val>[a-zA-Z]+[0-9]*|[0-9]+|/'.*/'|/[.*/])/s*(ni|in|[*//+-]|[=!><]=|[><])/s*((?&Val))/s*/))
Ver la demostración de expresiones regulares
Tenga en cuenta que
/'.*/'
Y
/[.*/]
Pueden coincidir demasiado, considere reemplazar con
/'[^/']*/'
y
/[[^][]*/]
.