Java Regex: Mathe funktionen trennen

lordfritte

Lieutenant
Registriert
Juli 2006
Beiträge
993
Hallo, ich brauche etwas Hilfe bei Regex, ich möchte eine mathematische Gleichung an den Grundfunktionen(+, -, /, *, ^) trennen, aber ausdrücke in Klammern sollen zusammen bleiben und unter einem e/E soll einmal die Trennung aussetzen.

Beispiel:
Aus: 5-2.4e-3*(4/3-(8/5))

Soll werden:
5
-
2.4e-3
*
(4/3-(8/3))
 
Sollte sehr einfach in zwei Schritten gehen...

1. Schritt
Eine Liste erzeugen, in der die substrings geschrieben werden, die entweder von klammern umgeben sind oder nicht.

2. Schritt
für jeden nicht geklammerten ausdruck aus schritt 1 eine unterteilung anhand der rechenzeichen machen.
 
das hier selektiert alle +-*/^ ohne voranstehendes e:
(?<!e|E)[\-\+\*\/\^]

und das ist für ein "von klammer auf bis klammer zu":
(\([^\)]*\)|\[[^\]]*\])*

für mehrfache klammerungen musst die zugehende klammer suchen, mit der rekursiven einschränkung weitere innere klammernpaare zu ignorieren.

hast also noch was zu tun ;)

oder du nimmst den ersten regexp und fügst den substring an das vorhergehende an, wenn es mit ner klammer endet
 
Zuletzt bearbeitet:
meiner ansicht nach ist eien regexp hier fehl am platz und wird nur unreadable code xD
lauf doch einfach den string durch und push die einzelnen gefundenen teile in eine list
sollte viel effektiever sein und wesentlich leichter umzusetzen
 
verwendest du String.split?

Ich habe jetzt nicht ganu auf dem Schirm, was Java in Regex alles unterstützt aber allgemein müsstest du nur eine Liste der Operationen in einen Präfix-Ausdruck packen, etwa so

(?<=[+-*/])

Das bedeutet: Teile des String an allen Stellen an denen vor einem Zeichen +, - * oder/ steht. Nach meinem Verständnis dürfte dann nichts weggeschnitten werden. (wie bei der Regex [+-*/]). Nun hast du die Rechenzeichen noch am Anfang jedes Stringes (außer dem ersten natürlich), die müsste man dann in einem zweiten Schritt extrahieren.

Wenn das nicht funktioniert, dann muss man eventuell alle Rechenoperationen einzeln behandeln und direkt an den Operationen auftrennen. Die verschwinden dann zwar, aber man weiß ja welche Operation gerade bearbeitet wird.
 
Okay, ich denke ich mache es ohne Regex, danke.
So kann ich sicher auch Arbeit sparen, indem ich direkt auswerten kann ob es jetzt ein Operator oder Operand ist.
 

Ähnliche Themen

Antworten
2
Aufrufe
848
A
Zurück
Oben