RegEx für Teile einer Berechnung

liann

Mitglied
Hallo,
ich habe in einem String eine Rechnung, die ich lösen will.
Java:
String allowedOperators = "+-*/^!";

public double[] getNumbers(String input) {
    Matcher matcher = Pattern.compile(...).matcher(input);
    (...) // das ist nicht das Problem. Es klappt etc.
}
Als ersten hatte ich den RegEx:
Java:
regex = RegExCollection.Decimal; // Decimal = "[+-]?[0-9]+(\\.([0-9]*))?".
// Klappt, nur leider nimmt das auch +-, also Vorzeichen mitrein. Wenn also eine Rechnung
// wie bspw. "3-45.0" ist, wird "3" und "-45.0" rausgefiltert
// Wie ich es aber möchte ist "3" und "45". Das minus wird dann später rausgeholt.

regex = RegExCollection.DecimalNoSymbol; // DecimalNoSymbol = "[0-9]+(\\.([0-9]*))?";
// Klappt auch nicht bei input = "3*-8".

regex = "^(" + RegExCollection.Decimal + ")|(...)"; // hier weiß ich nicht, wie ich
// sagen kann, dass ein Operator auf ein + oder - folgen kann. Normalerweise würde
// ja das einfach klappen, nur wird dann der Operator mit heraus "gefiltert"

Wie sollte der RegEx lauten? Oder gehe ich ganz falsch heran?
 

LimDul

Top Contributor
Uff ist mein Informatikstudium lange her. Ich weiß nicht, ob deine Anforderung noch mit Regulären Ausdrücken umsetzbar ist oder man dafür schon Kontextsensitive Grammatiken braucht. Bauchgefühl würde sagen, RegEx geht nicht aufgrund der Doppelbedeutung von + und - als Vorzeichen und Operator, aber es kann auch sein das es geht.
 
B

BestGoalkeeper

Gast
Leider ist das nicht ganz trivial. Je mehr ich darüber lesen desto verwirrter. Wenn es möglich ist mit rekursiven Naming Groups, so befürchte ich, dass die Ausdrücke so kompliziert werden, dass man sie nicht mehr verstehen kann. Aber was ist denn eigentlich die von dir gewünschte Ausgabe? Ein "Syntaxbaum"? dann schaue dir mal das Tool antlr an. Ich weiß diese Antwort ist etwas ausweichend, sorry.
 
B

BestGoalkeeper

Gast
Ich weiß nicht ob das weiterhilft:
Java:
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MP {
    public static void main(String[] args) {
        String re = "\\((?<e>(\\k<t>|\\k<t>(\\+|\\-)\\k<t>))\\)";
        String rt = "(?<t>(\\k<f>|\\k<f>(\\*|\\/)\\k<f>))";
        String rf = "(?<f>(\\d+\\.\\d+|\\d+))";
        String r = "(" + rf + "|" + rt + "|" + re + ")";
        System.out.println(Matcher.quoteReplacement(r));
        Pattern pat = Pattern.compile(r);
        Matcher mat = pat.matcher("(5+((6-1)*0.9))");
        while (mat.find()) {
            System.out.println(mat.group(0));
            String f = mat.group("f");
            String t = mat.group("t");
            String e = mat.group("e");
            if (f != null)
                System.out.println("f: " + f);
            if (t != null)
                System.out.println("t: " + t);
            if (e != null)
                System.out.println("e: " + e);
            for (int i = 1; i < mat.groupCount(); i++) {
                if (mat.group(i) != null)
                    System.out.println(i + ": " + mat.group(i));
            }
            System.out.println();
        }
    }
}

((?<f>(\\d+\\.\\d+|\\d+))|(?<t>(\\k<f>|\\k<f>(\\*|\\/)\\k<f>))|\\((?<e>(\\k<t>|\\k<t>(\\+|\\-)\\k<t>))\\))

Er findet leider 4 Matches, also nicht den kompletten Ausdruck.

Man bräuchte recursive named groups, forward references und either, imo. :oops:
 
B

BestGoalkeeper

Gast
Irgendetwas will nicht. Vielleicht ist es auch richtig. I don't know.
Java:
String[] sa = { "(?<e>(\\k<t>|(\\+|\\-)\\k<t>|\\k<t>(\\+|\\-)\\k<t>))", "(?<t>(\\k<f>|(\\*|\\/)\\k<f>|\\k<f>(\\*|\\/)\\k<f>))", "(?<f>(\\d+\\.\\d+|\\d+|\\(\\k<e>\\)))" };
String r = sa[0];
r = r.replaceFirst(Pattern.quote("\\k<t>"), Matcher.quoteReplacement(sa[1]));
r = r.replaceFirst(Pattern.quote("\\k<f>"), Matcher.quoteReplacement(sa[2]));
System.out.println(Matcher.quoteReplacement(r));
Pattern pat = Pattern.compile(r);
Matcher mat = pat.matcher("((6-1)*0.9)+5");
 

Meniskusschaden

Top Contributor
Wie sollte der RegEx lauten?
Hier ist noch ein möglicher Lösungsansatz (basierend auf einer positive look-behind assertion):
Java:
public class NumberExtractor {
    public static void main(String[] args) {
        Pattern pattern = Pattern.compile("((?<=^|[*\\/+-])([+-]))?\\d+(\\.\\d+)?");
        printMatches(pattern, "3-45.0");
        printMatches(pattern, "3+-45.0");
        printMatches(pattern, "45.0");
        printMatches(pattern, "-45.0");
        printMatches(pattern, "3*-8");
    }

    private static void printMatches(Pattern pattern, String string) {
        System.out.println("\nString: "+string);
        Matcher matcher = pattern.matcher(string);
        while (matcher.find()) {
            System.out.println(matcher.group());
        }
    }
}
Ausgabe:
Code:
String: 3-45.0
3
45.0

String: 3+-45.0
3
-45.0

String: 45.0
45.0

String: -45.0
-45.0

String: 3*-8
3
-8
 

Meniskusschaden

Top Contributor
@Meniskusschaden : Was ist eigentlich gesucht?
Ich habe das:
Also das Problem ist ja nicht, zu gucken ob der input syntax korrekt ist, sondern um jede Zahl heraus "zu filtern".
so verstanden, dass alle Zahlen inklusive optionalem Vorzeichen aufgefunden werden sollen.

Bei der Gelegenheit: ich habe in meinem Posting den Schrägstrich in der Zeichenklasse escaped. Das sollte eigentlich nicht nötig sein. Also müsste folgender RegEx ausreichen:
Code:
((?<=^|[*/+-])([+-]))?\\d+(\\.\\d+)?
 

Meniskusschaden

Top Contributor

Blender3D

Top Contributor
Hallo,
ich habe in einem String eine Rechnung, die ich lösen will.
Ich habe vor einiger Zeit einen Rechner programmiert ( funktioniert super ). Dort werden auch Strings eingegeben.
Für die Berechnung habe ich einen kleinen Parser geschrieben der einer Grammatik folgt.
Ich halte das für eine bessere Lösung als mit Regex herum zu doktoren.
[CODE lang="java" title="Funktion für die String Auswertung" highlight="12"]/**
* Calculates mathematical expression given by a string. ______________________
* < expression -> term | expression '+' term | expression '-' term > _________
* < term -> factor | term '*' factor | term '/' factor > _____________________
* < factor -> '+' factor | '-' factor | '(' expression ')'| number |
* functionName factor | factor '^' factor >
*
* @param text
* Text to parse.
* @return double
*/
public static double evaluate(final String text) throws IllegalArgumentException, ArithmeticException {[/CODE]
Calculater.png
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P RegEx für Zeiten Allgemeine Java-Themen 7
Neumi5694 Operatoren regEx für das Erstellen eines Strings verwenden Allgemeine Java-Themen 3
M Regex für Zahleneingabe in JavaFX Textfield Allgemeine Java-Themen 18
P RegEx mit HTML Parser für Java möglich? Allgemeine Java-Themen 10
S regex für einen Link Allgemeine Java-Themen 3
F Regex für (+ 2 3) Allgemeine Java-Themen 19
F String für RegEx escapen Allgemeine Java-Themen 8
T RegEx für "{ip}" ? Allgemeine Java-Themen 5
G Regex für Kontaktdaten Allgemeine Java-Themen 2
K Regex für Ergebnisse (9:9, 2:1.) Allgemeine Java-Themen 3
H Frage regex greater than less than Allgemeine Java-Themen 7
N Regex schlägt nicht an Allgemeine Java-Themen 10
W Variable Initialisierung mit dem Ergebnis einer Regex Allgemeine Java-Themen 1
T regex case insensitive trimmed Allgemeine Java-Themen 6
S Zeichen | in regex Allgemeine Java-Themen 8
X Regex mit mehreren Bedingungen machen Allgemeine Java-Themen 5
N Hilfe bei RegEx benötigt Allgemeine Java-Themen 3
C Java17 und Regex Allgemeine Java-Themen 13
OnDemand RegEx /compilebekomme nicht die erwarteten Werte Allgemeine Java-Themen 9
N Gierigen Regex in nicht-gierigen umwandeln Allgemeine Java-Themen 4
N E-Mail Validator (ohne Regex!) Allgemeine Java-Themen 7
OnDemand Regex von bis Allgemeine Java-Themen 6
W Versionsnummer auslesen - Regex ist zickig Allgemeine Java-Themen 2
G Regex Allgemeine Java-Themen 2
L regex ganzer string? Allgemeine Java-Themen 2
MiMa Geldbetrag mit regex ermitteln. Allgemeine Java-Themen 14
W RegEx Stringliteral finden - Jflex Allgemeine Java-Themen 5
D Regex Probleme Allgemeine Java-Themen 2
Kirby.exe Regex charakter ignorieren Allgemeine Java-Themen 12
S Java SAT (Haltbarkeitsproblem) mit Regex Allgemeine Java-Themen 6
S [Regex] Nur diese Zeichen beachten Allgemeine Java-Themen 1
M Bitte Hilfe mit REGEX (Negieren) Allgemeine Java-Themen 4
J Compilerfehler bis in java.util.regex.Pattern... Allgemeine Java-Themen 2
C PDFBox: Nach RegEx ganze Zeile Allgemeine Java-Themen 4
S Regex mit UND-Verknüpfung Allgemeine Java-Themen 1
D Regex: Komplettes Wort bekommen Allgemeine Java-Themen 3
P RegEx Allgemeine Java-Themen 3
W String Parsen und auf eigenes Muster anwenden (kein Regex) Allgemeine Java-Themen 11
Y regex | n-faches Vorkommen oder gar keins Allgemeine Java-Themen 6
turmaline Regex gegen Regex prüfen Allgemeine Java-Themen 4
HarleyDavidson Regex - Optimierung Allgemeine Java-Themen 4
T Best Practice Wortregeln RegEx Allgemeine Java-Themen 11
A ALTER TABLE mit Hilfe von RegEx zerlegen, splitten Allgemeine Java-Themen 5
H Interpreter-Fehler Regex kompiliert nicht Allgemeine Java-Themen 5
M RegEx alle Matches ausgeben Allgemeine Java-Themen 5
Iron Monkey Mit Regex nach Beträge suchen Allgemeine Java-Themen 4
T REGEX Erklaerung Allgemeine Java-Themen 14
T Nur innerhalb des regex-Match ersetzen Allgemeine Java-Themen 9
H Pic Download / Regex Problem Allgemeine Java-Themen 7
F Frage zu Regex möglich Allgemeine Java-Themen 4
M Regex... mal wieder Allgemeine Java-Themen 3
H RegEx - Ersetze alles bis Leerzeichen Allgemeine Java-Themen 5
S regex verbrät CPU Allgemeine Java-Themen 6
V Regex Bereichs Filter Allgemeine Java-Themen 4
127.0.0.1 RegEx _ und 0-9 Allgemeine Java-Themen 45
S Entfernen von allen Nicht-Buchstaben chars aus einem String ohne Regex..? Allgemeine Java-Themen 10
P Java String Regex Allgemeine Java-Themen 2
AyKay Regex XPath Allgemeine Java-Themen 4
C Regex (Case insensitive und Umlaute) Allgemeine Java-Themen 4
D Regex Raute erkennen Allgemeine Java-Themen 2
nrg Zweistelligen Zahlenbereich mit RegEx Allgemeine Java-Themen 8
GilbertGrape Regex-Problem Allgemeine Java-Themen 2
W Denkblockade RegEx Allgemeine Java-Themen 2
S eigene regEx schreiben Allgemeine Java-Themen 4
C Regex expandieren Allgemeine Java-Themen 6
C Regex Überschniedung von Ausdrücken Allgemeine Java-Themen 16
reibi RegEX - Teilstring Allgemeine Java-Themen 6
R Java-RegEx terminiert nicht Allgemeine Java-Themen 3
M Regex: Ich stehe auf dem Schlauch Allgemeine Java-Themen 2
V Kleines Regex-Problem Allgemeine Java-Themen 3
B Regex "Problem" Allgemeine Java-Themen 4
B RegEx: (Um-)formulieren eines Pattern zur Identifizierung komplexer URLs Allgemeine Java-Themen 7
J Regex: Fertige URLS aus Javascript Allgemeine Java-Themen 3
N Java regex Allgemeine Java-Themen 5
K Regex JSON Allgemeine Java-Themen 3
J RegEx Ausdruck Allgemeine Java-Themen 2
J Regex: URLS aus CSS Allgemeine Java-Themen 2
G RegEx- Ausdruck Allgemeine Java-Themen 4
G RegEx kein Unterstrich Allgemeine Java-Themen 2
A Text via RegEx durchsuchen und teile ersetzten Allgemeine Java-Themen 5
C Regex: Zahl ohne führende Null Allgemeine Java-Themen 13
W RegEx Zeile parsen Medium Allgemeine Java-Themen 8
X Java String Regex - Sonderzeichen Filtern Allgemeine Java-Themen 5
S Dateiname mit Regex parsen Allgemeine Java-Themen 3
Loyd Noch ne Regex-Frage: Verschachtelte Ausdrücke Allgemeine Java-Themen 4
R Java Regex Frage Allgemeine Java-Themen 17
Daniel_L RegEx-Frage: Ersetzen in UBB ausschließen Allgemeine Java-Themen 2
M Große Datei mit Regex durchsuchen Allgemeine Java-Themen 4
E Regex alles nach ? löschen Allgemeine Java-Themen 4
M RegEx-Frage Allgemeine Java-Themen 2
R Regex Tokenizer Allgemeine Java-Themen 11
E Regex HTML Tag und Inhalt löschen Allgemeine Java-Themen 4
H RegEX und eMail Allgemeine Java-Themen 4
L-ectron-X Regex zum Entfernen von mehrzeiligen Kommentaren Allgemeine Java-Themen 2
martin82 Regex - JTable - Filter Allgemeine Java-Themen 10
nrg Kleine Hilfe mit RegEx Allgemeine Java-Themen 2
B Regex-Fehler nach lib-Update Allgemeine Java-Themen 2
K Contrains oder Regex Allgemeine Java-Themen 3
J replaceAll , "[", "]" & regex Allgemeine Java-Themen 12
P RegEx und $-Zeichen als Literal Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben