Validando equações lineares com expressões regulares?
-
21-09-2019 - |
Pergunta
Como posso validar equações lineares com expressões regulares ou há outra maneira além de usar expressões regulares. Vou usar ^ para denotar um expoente.
2x + 3 = 8 // isso deve validar bem
3x + 2y + 4z = 12 // Isso deve validar bem
4x^2 + 2y = 22 // Isso não deve validar devido à potência.
4xy + 3y = 45 // Isso não deve validar devido ao produto de duas incógnitas.
2/x + 4y = 22 // Isso não deve validar por causa do desconhecido no denominador
(3/4) x + 3y + 2z = 40 // Isso deve validar bem.
Solução
Eu começaria escrevendo uma definição de uma equação linear válida usando Backus-naur notação, com coisas como:
<integer> := <digit> | <integer> <digit>
<constant> := <integer> | ...
<variable> := <letter>
<term> := <constant> | <variable> | <constant> <variable>
e assim por diante.
Existem muitas maneiras de transformar isso em um validador. Tendo alguma experiência com isso, eu usaria YACC ou Bison para escrever um analisador que só geraria uma árvore de análise se a entrada fosse uma equação linear válida.
Você pode encontrar expressões regulares muito limitadas para fazer o que você precisa - simplesmente não as uso o suficiente para saber.
Outras dicas
Os casos que você mencionou são fáceis:
fail if /[xyz]\s*\^/;
fail if /\/\s*[xyz]/;
fail if /([xyz]\s*){2,}/;
(esta é uma sintaxe perl, assumindo $_
contém a expressão e fail
é o que quer que você faça quando quiser desistir.)
Aqui você pode substituir xyz
com o que for uma expressão válida para uma variável.
Mas, em geral, isso exigirá análise real da expressão, que é um trabalho para Lex/Yacc ou algo assim, não uma expressão regular.
Por exemplo, se "xy" for um nome de variável legítima, é claro que tudo isso se mata.