Validieren von linearen Gleichungen mit regulären Ausdrücken?
-
21-09-2019 - |
Frage
Wie kann ich lineare Gleichungen mit regulären Ausdrücken zu validieren oder gibt es eine andere Art und Weise reguläre Ausdrücke neben der Verwendung. Ich verwende ^ einen Exponenten zu bezeichnen.
2x + 3 = 8 // Dies sollte in Ordnung bestätigen
3x + 2y + 4z = 12 // Das sollte in Ordnung bestätigen
4x ^ 2 + 2y = 22 // Dies sollte nicht wegen der Macht validieren.
4xy + 3y = 45 // Dies sollte nicht wegen des Produkts von zwei Unbekannten validieren.
2 / x + 4j = 22 // Dies sollte nicht wegen der unbekannten im Nenner bestätigt
(3/4) x + 3y + 2z = 40 // Das sollte in Ordnung validieren.
Lösung
Ich würde zunächst eine Definition einer gültigen linearen Gleichung zu schreiben mit Backus -Naur Notation, mit Dingen wie:
<integer> := <digit> | <integer> <digit>
<constant> := <integer> | ...
<variable> := <letter>
<term> := <constant> | <variable> | <constant> <variable>
und so weiter.
Es gibt viele Möglichkeiten, dass in einen Prüfer zu drehen. einige Erfahrung mit ihm zu haben, ich yacc oder Bison verwenden würde, einen Parser zu schreiben, die nur einen Parse-Baum, wenn die Eingabe eine gültige lineare Gleichung war erzeugen würden.
Sie können reguläre Ausdrücke zu finden sind zu begrenzt, um zu tun, was Sie brauchen -. Ich sie nicht nur verwenden genug, um zu wissen,
Andere Tipps
Die Fälle, die Sie erwähnt haben, sind einfach:
fail if /[xyz]\s*\^/;
fail if /\/\s*[xyz]/;
fail if /([xyz]\s*){2,}/;
(dies ist Perl-Syntax, unter der Annahme, $_
den Ausdruck enthält, und fail
ist, was auch immer es ist, dass Sie tun, wenn Sie aufgeben wollen.)
Hier können Sie xyz
mit ersetzen, was auch immer ist ein gültiger Ausdruck für eine Variable.
Aber im Allgemeinen wird diese tatsächliche Analyse des Ausdrucks erfordern, was ein Job für lex / yacc oder so ähnlich, keine regulären Ausdruck.
Zum Beispiel, wenn „xy“ ist ein legitimer Variablenname, dann natürlich diese alle bröckeln.