Java Regex für lineare Funktion?
Ich versuche ein Programm zu erstellen, welchem man eine lineare Funktion als String übergibt. Es soll dann z.B. Nullstellen berechnen.
Reminder: y = m*x + n
Ich muss zuerst einmal die Eingabe überprüfen, also ob sich in der Eingabe (getrimmt) nur erlaubte Symbole finden (zu Beginn erstmal nur Zahlen, Vorzeichen und x). Wie mache ich das mit einer Regex, sodass ich weiß ob die Eingabe gültig ist oder nicht.
Wie mache ich das?
1 Antwort
Die einfachste Lösung wäre eine Auftrennung der Gleichung, sodass der Nutzer den Faktor von x sowie den Summand separat eingeben muss. Das würde die Prüfung dann auch erleichtern.
Ein regulärer Ausdruck für den obigen Ausdruck könnte hingegen so aussehen:
y=(\-?\d+)x([\+\-]\d+)
Die beiden relevanten Zahlen werden gruppiert, sodass sie nach dem Parsen sogleich aus der Eingabe herausgezogen werden können.
Vor der Prüfung der Eingabe wäre es wohl sinnvoll, Whitespaces aus der Eingabe zu entfernen
input.replaceAll("\\s", "")
denn der obige Ausdruck würde bei dieser validen Eingabe:
y = 5x + 2
sonst scheitern. Deshalb nun an jeder Stelle Whitespaces einzuplanen, halte ich dafür nicht so gut, denn es macht den Ausdruck nur komplizierter.
Im Übrigen wäre auch diese Eingabe invalid:
y=5x+-2
Ich habe den Operator direkt auf ein Zeichen begrenzt, um eine valide Zahl in der zweiten Gruppe aufnehmen zu können. Würde man die Anzahl erlaubter Operatoren auf zwei erhöhen, müsste man wohl diese nachträglich noch einmal speziell parsen oder man findet eine Lösung wie diese:
y=(\-?\d+)x[\+\-]?([\+\-]\d+)
und wertet dann den Operator konkret aus:
int factor = "-".equals(group2) ? -1 : 1;
um ihn später mit n zu multiplizieren.
Vielen Dank. Ich werde es jetzt auch lieber trennen mit der Eingabe. Mir war klar dass das einfacher wäre, aber wollte es mir nicht zu einfach machen. Hab jetzt aber gemerkt, dass es sonst doch zu viel wird. Nicht einmal zu komplex, aber einfach viel zu viel Code, der fehleranfällig ist. Und das bringt ja nicht einmal einen wirklich nenneswerten Vorteil.