Validación de ecuaciones lineales con las expresiones regulares?
-
21-09-2019 - |
Pregunta
¿Cómo puedo validar ecuaciones lineales con expresiones regulares o hay otra manera además de usar expresiones regulares. Voy a usar ^ para denotar un exponente.
2x + 3 = 8 // Esto debe validar fina
3x + 2y + 4z = 12 // Esto debe validar bien
4x ^ 2 + 2y = 22 // Esto no debe validar debido a la potencia.
4xy + 3y = 45 // Esto no debe validar por el producto de dos incógnitas.
2 / x + 4y = 22 // Esto no debe validar porque de lo desconocido en el denominador
(3/4) x + 3y + 2z = 40 // Esto debe validar bien.
Solución
Me gustaría empezar por escribir una definición de una ecuación lineal válida utilizando Backus -Naur notación , con cosas como:
<integer> := <digit> | <integer> <digit>
<constant> := <integer> | ...
<variable> := <letter>
<term> := <constant> | <variable> | <constant> <variable>
y así sucesivamente.
Hay muchas formas de convertir esto en un validador. Tener un poco de experiencia con ella, que haría uso de yacc o bisontes para escribir un analizador que sólo generaría un árbol de análisis si la entrada fue una ecuación lineal válida.
Es posible encontrar expresiones regulares son demasiado limitados para hacer lo que tiene -. Es sólo que no los utilizan lo suficiente para saber
Otros consejos
Los casos que has mencionado son fáciles:
fail if /[xyz]\s*\^/;
fail if /\/\s*[xyz]/;
fail if /([xyz]\s*){2,}/;
(esta es la sintaxis de Perl, asumiendo $_
contiene la expresión, y fail
es lo que es lo que hace cuando quiere darse por vencido.)
Aquí puede sustituir xyz
con lo que es una expresión válida para una variable.
Pero, en general, esto requerirá el análisis real de la expresión, que es un trabajo para lex / yacc o algo por el estilo, no una expresión regular.
Por ejemplo, si "xy" es un nombre de variable legítimo, entonces, por supuesto, todo esto se desmorona.