2009-10-15 12 views
0

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

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

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

4x^2 + 2y = 22 // Cela ne devrait pas valider parce que du pouvoir.

4xy + 3y = 45 // Ceci ne devrait pas être validé 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 bien.

Répondre

1

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

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

et ainsi de suite.

Il existe plusieurs façons de transformer cela en un validateur. Ayant une certaine expérience avec cela, j'utiliserais yacc ou bison pour écrire un analyseur qui ne générerait un arbre d'analyse que si l'entrée était une équation linéaire valide.

Vous trouverez peut-être que les expressions régulières sont trop limitées pour faire ce dont vous avez besoin - je ne les utilise pas assez pour les connaître.

+0

Merci, je vais regarder dans yacc et bison. – Xaisoft

1

Les cas que vous avez mentionnés sont faciles:

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

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

Ici vous pouvez remplacer xyz par ce qui est une expression valide pour une variable.

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

Par exemple, si "xy" est un nom de variable légitime, alors, bien sûr, tout s'effondre.

+0

Merci, c'est encore un peu confus car je ne connais pas perl. En outre, ce ne sont que quelques échantillons que j'ai donnés, les équations seraient inconnues. – Xaisoft

Questions connexes