2016-09-30 4 views
0

Ich habe ein Rätsel, ich muss eine mögliche abwechslungsreiche mathematische Zeichenfolge in separate Entitäten trennen, um in einer ArrayList zu speichern.Java Reguläre Ausdrücke mit Math-Operatoren

Der Eingang kann von einem Scanner gelesen werden. Dies kann einer der folgenden Punkte sein.

Scanner input = new Scanner(System.in); 
String read = input.nextLine(); 
ArrayList al = new ArrayList(); 

-5 + 10 //possible value of read 
9--5 //possible value of read 
-20* 10 //possible value of read 

Grundsätzlich ich brauche die erste Zahl und eine mögliche negative Vorzeichen, alle ignorieren führende oder nachfolgende Leerzeichen und speichern sie greifen, dann auf das nächste Zeichen Leerzeichen ignoriert und speichern sie (der Betreiber des Problems), und dann die nächste Zahl mit einem optionalen negativen Vorzeichen, wobei Whitespace wieder ignoriert wird.

Ich bin nicht sehr gut mit Regex, und es gibt eine Menge komplizierter Möglichkeiten hier, dass ich nicht weiß, wie man anpackt.

Wenn ich es zu legen hatte logisch aus, würde ich es sagen so:

Erhalten erste Nicht-Leerzeichen und enden an der letzten Nummer Ziffer, die folgt unmittelbar.

Erhalten nächstes Nicht-Leerzeichen

nächste Nicht-Leerzeichen und enden an den letzten Nummer Ziffer erhalten, die es direkt folgt.

Irgendwelche Hinweise auf Syntax, um das zu erreichen?

EDIT: Ich versuche nicht einfach, das Ergebnis des fraglichen Ausdrucks zu evulieren, ich muss es aufteilen und in einer ArrayList speichern, um später als Teil einer Fraktionsklasse zu manipulieren.

+2

Sie sollen nicht regex verwenden Dazu wird es nicht mit verschachtelten arithmetischen Ausdrücken skalieren. Sie benötigen einen Parser. –

+0

Müssen Sie Regex verwenden? Wenn nicht, lesen Sie diese [Antwort] (http://stackoverflow.com/a/36341949/4256677) – varontron

Antwort

0

Nicht wirklich elegant, aber wenn Sie für die Regex suchen Zahlen greifen sowohl positive als auch negative, können Sie diese Regex verwenden

-?\d+|\*|\/|\+|\-

- für negative Zahlen sieht

? es macht eine optionale Suche

\d sucht nach einer Ziffer

+ packt alles, bis ein Leerzeichen

die Rohre bedeuten „oder“ so dass es eine positive negative Zahl greifen wird, oder ein * oder ein / oder ein + oder ein -