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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top