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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top