regular php regex pcre

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 /[[^][]*/] .