Reguläre Ausdrücke: Polynomterme

Skrodde

Aktives Mitglied
Hallo zusammen,
ich bin gerade dabei mir einen regulären Ausdruck zu bauen, mit dem ich Polynomterme der folgenden Formen erkennen kann:
Code:
2
,
Code:
2x
,
Code:
x
,
Code:
x^2
,
Code:
2,3x^27000
, jeweils mit + oder - davor. Jetzt scheitere ich bereits daran, eine Zahl wie
Code:
42,1337
zu erkennen. Mein Ansatz sieht bisher aus wie folgt:
Java:
String s = "42,1337";
System.out.println(s.matches("\\d+[,\\d+]?"));
Nun hätte ich gedacht, dass mein regulärer Ausdruck sicher stellt, dass ich mindestens eine führende Ziffer habe, gefolgt von potentiell mehr Zifferen. Falls es ein Komma im Ausdruck gibt, wird dieses von mindestens einer Ziffer gefolgt. Nun bekomme ich als System output aber leider ein
Code:
false
. ;(
Kann mir jemand auf die Sprünge helfen, was ich hier falsch mache?
Danke sehr, Gruß, Skrodde
 
N

nillehammer

Gast
Die eckigen Klammern sind für sog. Character-Classes. D.h. sie enthalten eine Aufzählung gültiger Zeichen. Innerhalb von eckigen Klammern verlieren einige Zeichen ihre Sonderbedeutung und werden als Literal aufgefasst. Bin mir jezt nicht sicher, welches Zeichen hier Probleme macht, aber das ist sicher die Ursache für den Fehler.

Langer Rede kurzer Sinn, die eckigen Klammern sind hier eh falsch. Ersetze sie durch normale runde Klammern und es geht.
 
Zuletzt bearbeitet von einem Moderator:

Skrodde

Aktives Mitglied
Hallo nillehammer,
vielen dank für die schnelle Hilfe. Ich war durch den Begriff der "Capturing Group" (siehe hier) etwas von runden Klammern abgeschreckt, jetzt funktioniert aber alles wunderbar :toll:
Vielen Dank und ein schönes Wochenende!
 
N

nillehammer

Gast
Ich war durch den Begriff der "Capturing Group"... etwas von runden Klammern abgeschreckt
Das ist auch durchaus berechtigt. Der Match innerhalb der Capturing Group wird sich nämlich gemerkt. Und auch, wenn das vielleicht nicht viel ist, werden dafür unnötig Resourcen verbraucht. Durch folgende Zeichenfolge machst Du aus der Capturing Group eine non capturing Group:
Code:
(?:,\\d+)
Aber vielleicht willst Du Dir den Match ja doch merken. Damit könntest Du nämlich prüfen, ob ein Komma-Anteil eingegeben wurde oder vielleicht willst Du nur den Teil ausgeben oder oder.
[EDIT]
Ach ja, das "Merken" geht natürlich nur, wenn Du Dir die Regex als Pattern compilest und dann mit den zu testenden String einen Matcher erzeugst.
[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:

Skrodde

Aktives Mitglied
Hallo nillehammer und hoax,
zunächst vielen Dank für die ausführliche Erläuterung der capturing group, ich schaue jetzt mal, wie es so mit der Performance ist, wenn ich alles mit runden Klammern als capturing group mache und wenn es dann zu viel wird, kann ich die immer noch rausnehmen.
@Hoax Vielen Dank für die Anregung, das werde ich mal ausprobieren, denn mein aktuelles Programm liefert leider noch nicht das gewünschte Ergebniss:
Java:
//Possible Cases:
String decimal = "\\d+(,\\d+)?";
String variable = "\\D+"; //TODO prevent the variable "+" from being valid, only allow a-zA-Z?
String literal = decimal + variable;
String exponent = "(\\x5E(\\d)+)?";
String literal2 = variable + exponent;
String term = literal + exponent;			
String regExTermStart = decimal + "|" + variable + "|" + literal + "|" + literal2 + "|" + term;
String regExTerm = "[+|-]" + decimal + "|[+|-]" + variable + "|[+|-]" + literal + "|[+|-]" + literal2 + "|[+|-]" + term;
String regExFunction = "(" + regExTermStart + ")?" + "("+regExTerm+")+" + "|" 
				+ "(" + regExTermStart + "){1}" + "("+regExTerm+")*";
		
String s = "xyz+1337-1337x^24+0,1337-0,1337+x^24-y";
		
Pattern pattern = Pattern.compile(regExTerm);
Matcher matcher = pattern.matcher(s);
// Check all occurrence
while (matcher.find()) {
	System.out.print("Start index: " + matcher.start());
	System.out.print(" End index: " + matcher.end() + " ");
	System.out.println(matcher.group());
}

Führt bei mir zu der Ausgabe:
Code:
Start index: 3 End index: 8 +1337
Start index: 8 End index: 13 -1337
Start index: 17 End index: 24 +0,1337
Start index: 24 End index: 31 -0,1337
Start index: 31 End index: 34 +x^
Start index: 36 End index: 38 -y
Das sind ja aber nicht die einzelnen Terme ???:L

Was fehlt denn wohl jetzt noch?
Gruß, Skrodde
 

HoaX

Top Contributor
Mit Regex auf sowas los zu gehen ist nicht gerade der einfach lesbare/leicht nachvollziehbare Weg, darum nutzt ich in meinem Beispiel ja auch Antlr ;)
 

Mujahiddin

Top Contributor
Nur nebenbei:
Schreib mal, was du als Ausgabe gern hättest.

Code:
"[+|-]"
bist du sicher, dass das so geplant ist? Ich denke, du meinst eher
Code:
"[\\+\\-]"

E:
Code:
"(" + regexTermStart + "){1}"
ist das gleiche auch ohne
Code:
"{1}"
 

Skrodde

Aktives Mitglied
Hallo zusammen,
nach einem nahezu programmier-freien Wochenende melde ich mich zurück:
Nur nebenbei:
Schreib mal, was du als Ausgabe gern hättest.
Ich hätte gerne, dass aus dem Beispielstring folgende Ausrücke einzeln ausgelesen werden (hier durch Semikolon getrennt:
Code:
xyz; +1337; -1337x^24; +0,1337; -0,1337; +x^24; -y
. Danach könnte ich Sie dann weiter verarbeiten. Momentan werden aber vor allem die Exponenten noch "verschluckt".

Code:
"[+|-]"
bist du sicher, dass das so geplant ist? Ich denke, du meinst eher
Code:
"[\\+\\-]"
Ich möchte dass jeder Term von einem "+" oder einem "-" geführt wird, aber ich sehe gerade, dass wenn ich
Code:
[+|-]
auch das | akzeptiert wird, dass soll natürlich nicht sein und damit muss es
Code:
[+-]
heißen. Danke für den Hinweis :toll:

E:
Code:
"(" + regexTermStart + "){1}"
ist das gleiche auch ohne
Code:
"{1}"
Stimmt natürlich und wird geändert.

Vielen Dank für die Hilfe soweit, ich schaue mir jetzt mal Antlr an,
Gruß, Skrodde
 

Skrodde

Aktives Mitglied
Hallo zusammen und vielen Dank für die Hilfe :toll:. Ich habe mich entschlossen, das Problem mit Antlr anzugehen, da es doch flexibler ist als RegEx.

Gruß, Skrodde
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Namen von Methoden über Reguläre Ausdrücke bearbeiten Allgemeine Java-Themen 6
E Reguläre Ausdrücke: String-Ersetzung Allgemeine Java-Themen 0
G Reguläre Ausdrücke Allgemeine Java-Themen 11
G Reguläre Ausdrücke Allgemeine Java-Themen 2
jstei001 Reguläre Ausdrücke bearbeiten/ändern Allgemeine Java-Themen 14
C reguläre Ausdrücke finden nicht was sie finden sollen Allgemeine Java-Themen 8
F Reguläre Ausdrücke und BBCode Allgemeine Java-Themen 10
J String für reguläre Ausdrücke escapen Allgemeine Java-Themen 2
C Reguläre Ausdrücke - X{0}?.* Allgemeine Java-Themen 8
C Reguläre Ausdrücke, String rückwärts durchsuchen Allgemeine Java-Themen 6
I Reguläre Ausdrücke und das "~" Symbol Allgemeine Java-Themen 2
B Reguläre ausdrücke mit variablen? Allgemeine Java-Themen 12
H Regex - Reguläre Ausdrücke Allgemeine Java-Themen 3
A Reguläre Ausdrücke vereinfachen Allgemeine Java-Themen 19
J Reguläre Ausdrücke Allgemeine Java-Themen 14
A Zufallswerte für reguläre Ausdrücke Allgemeine Java-Themen 15
G Reguläre Ausdrücke Allgemeine Java-Themen 8
R reguläre Ausdrücke Allgemeine Java-Themen 2
L Reguläre Ausdrücke und Fehlerbehandlung Allgemeine Java-Themen 10
RaoulDuke Reguläre Ausdrücke - Daten extrahieren Allgemeine Java-Themen 3
L reguläre Ausdrücke? Allgemeine Java-Themen 2
R Reguläre Ausdrücke (mehrzeilig) Allgemeine Java-Themen 2
C Reguläre Ausrücke Punkte im Satz richtig erkennen Allgemeine Java-Themen 6
E Reguläre Txt in Tree parsen Allgemeine Java-Themen 2
J Reguläre Ausrücke - Klammer nicht vorhanden Allgemeine Java-Themen 2
B kontextfreie grammatik / reguläre grammatik Allgemeine Java-Themen 2
P reguläre ausrücke und String.matches Allgemeine Java-Themen 4
S Reguläre Ausdruecke! Allgemeine Java-Themen 5
A Lambda-Ausdrücke Allgemeine Java-Themen 5
M Lambada Ausdrücke - wie funktionieren und benutzt man sie? Allgemeine Java-Themen 5
S Lambda Ausdrücke: @FunctionalInterface Instanzen auf null prüfen Allgemeine Java-Themen 9
Z Design um boolsche ausdrücke zu speichern & auszuwerten Allgemeine Java-Themen 3
R Logische Ausdrücke in Java Allgemeine Java-Themen 4
Loyd Noch ne Regex-Frage: Verschachtelte Ausdrücke Allgemeine Java-Themen 4
H Geklammerte Ausdrücke nach Divide&Conquer Allgemeine Java-Themen 2
B Parser für logische Ausdrücke Allgemeine Java-Themen 9
J Expression Language für mathematische Ausdrücke Allgemeine Java-Themen 8
B Regeuläre Ausdrücke Allgemeine Java-Themen 8
G arithmetische ausdrücke Allgemeine Java-Themen 5
M Regular Expression - verschiedene Ausdrücke testen (grep | ) Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben