Question

Comment puis-je valider des équations linéaires avec des expressions régulières ou est-il une autre façon en plus d'utiliser des expressions régulières. Je vais utiliser ^ pour désigner un exposant.

2x + 3 = 8 // Cela devrait valider fin

3x + 2y + 4Z = 12 // Cela devrait valider fin

4 x ^ 2 + 2y = 22 // Cela ne devrait pas valider en raison de la puissance.

4xy + 3y = 45 // Cela ne devrait pas valider en raison du produit de deux inconnues.

2 / x + 4y = 22 // Cela ne devrait pas valider en raison de l'inconnu dans le dénominateur

(3/4) x + 3y + 2z = 40 // Cela devrait valider très bien.

Était-ce utile?

La solution

Je commence par écrire une définition d'une équation linéaire valide en utilisant Backus -Naur notation , avec des choses comme:

<integer> := <digit> | <integer> <digit>
<constant> := <integer> | ...
<variable> := <letter>
<term> := <constant> | <variable> | <constant> <variable>

et ainsi de suite.

Il y a plusieurs façons de le transformer en un validateur. Avoir une certaine expérience avec elle, j'utiliser yacc ou bison d'écrire un analyseur qui ne génère un arbre d'analyse syntaxique si l'entrée était une équation linéaire valide.

Vous trouverez peut-être des expressions régulières sont trop limitées pour faire ce que vous avez besoin -. Je ne sais pas assez pour les utiliser

Autres conseils

Les cas que vous avez mentionnés sont faciles:

fail if /[xyz]\s*\^/;
fail if /\/\s*[xyz]/;
fail if /([xyz]\s*){2,}/;

(ce qui est la syntaxe Perl, en supposant $_ contient l'expression, et fail est tout ce que vous faites quand vous voulez abandonner.)

Vous pouvez remplacer xyz avec tout ce qui est une expression valide pour une variable.

Mais en général, cela nécessitera l'analyse réelle de l'expression, qui est un travail pour comme lex / yacc ou quelque chose qui, pas une expression régulière.

Par exemple, si « xy » est un nom de variable légitime, alors bien sûr tout cela crumbles.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top