Java Regex Problem

monsterhaus

Cadet 4th Year
Registriert
Feb. 2009
Beiträge
94
Hallo,

ich versuche gerade ein Muster für eine Regex zu erstellen.
Nehmen wir an, ich habe den String
Code:
-2.23x²+3.2x+13

und möchte davon mit einem Matcher die Start-und Endposition vom Teilstring "+3.2x" haben.
Dazu habe ich schon eine Abfrage gebastelt, allerdings gibt er mir immer den Teilstring bis zum ersten "²" aus.
Code:
[+-]?[0-9]*[\\.]?[0-9]*x
Ich hänge also an dem "x" im gesuchten Teilstring.
Jetzt meine Frage: Wie kann ich ein "x²" im Teilstring komplett "verbieten"?

Ich hoffe, dass ich mich verständlich ausgedrückt habe und mir jemand freundlicherweiße weiterhilft:)

PS: Ich habe auch schon
Code:
[+-][0-9]*[\\.]?[0-9]*x[^²]
ausprobiert, jedoch bekomme ich dann als Ergebnis: "+3.2x+". Ich möchte aber das letzte "+" nicht haben.
(Den ergebenen String kann ich auch nicht um eine Stelle kürzen, sodass sich "+3.2x" ergeben würde, da es auch möglich ist, dass der gesamte String "-2.23x²+3.2x" lauten könnte und es somit kein "+" am Ende geben würde)
 
Da ich nicht genau weiß was du machen möchtest, nehme ich mal an du möchtest das Polynom in seine Koeffizienten zerlegen?

Ich habe dir mal eine kleines Programm gebastelt, das einen Teil der Aufgabe erledigt.
Es spaltet das Polynom an + und - in Teilstrings auf und extrahiert das jeweilige Vorzeichen.

Da du darauf hinaus wolltest, habe ich Start- und Endpositionen der Teilstrings mit ausgegeben. Eigentlich würde ich aber nur noch in die Tokens hineinschauen um das x auszuwerten.

Code:
import java.util.Scanner;
import java.util.regex.MatchResult;

public class PolynomialTokens
{
	public static void main( String[] args )
	{
		String polynomialString = "2.23x²+3.2x-13";
		Scanner polyScanner = new Scanner( polynomialString );
		polyScanner.useDelimiter( "[+-]" );

		while ( polyScanner.hasNext() )
		{
			String token = polyScanner.next();
			MatchResult matchResult = polyScanner.match();
			int matchResultStart = matchResult.start();
			int matchResultEnd = matchResult.end();

			String sign;
			if ( matchResultStart != 0 )
			{
				sign = polynomialString.substring( matchResultStart - 1, matchResultStart );
			}
			else
			{
				sign = "+";
			}

			System.out.println( "Sign: " + sign);

			System.out.println( "Token: " + token );
			System.out.println( "Start/End: " + matchResultStart + " / " + ( matchResultEnd - 1 ) );
			System.out.println();
		}
	}
}

Ausgabe:

Code:
Sign: +
Token: 2.23x²
Start/End: 0 / 5

Sign: +
Token: 3.2x
Start/End: 7 / 10

Sign: -
Token: 13
Start/End: 12 / 13
 
Danke schonmal für die Lösung.
Bei dem String handelt es sich um eine beliebige Parabelgleichung, bei der ich versuche über die Mitternachtsformel die Nullstellen im Koordinatensystem zu berechnen. Dafür benötige ich eine allg. Parabelgleichung, nämlich "ax^2 + bx + c". Ich benötige also die Variablen a, b, c. Da hilft mir dein Code schon sehr weiter, allerdings möchte ich mein Programm so gestallten, dass der Benutzer die Parabelgleichung in beliebiger Form eingeben kann, z.B. "-c + ax^2 + bx". Dann müsste ich immer mit vielen Abfragen feststellen, in welchem Token mein a, b oder c enthalten ist, um es anschließend zu extrahieren. Ich habe deshalb schon direkt selektiert, welche Form der User gewählt hat, um anschließend passend zu jeder Form weitere Anweisungen einzuleiten. Aus diesem Grund wäre es für mich einfacher, die Teilstrings wie oben genannt zu extrahieren. Vlt. hat noch jemand eine Idee, wie ich für jeden Teilstring (ax^2;bx;c) einen eindeutigen, regulären Ausdruck finden kann? Für ax^2 und c ist es ja kein Problem, nur wie gesagt fehlt mir das bx. Ich hoffe, ihr versteht, was ich vorhabe:)
 
Eigentlich sollte das in meinem Ansatz total einfach gehen. Die Position der Koeffizienten ist damit sowieso Egal. Man muss für jedes Token nur schauen ob es x, x²/x^2 oder kein x enthält und den Wert je nachdem a, b oder c zuweisen.
Besonders elegant ist es wenn man den Koeffizienten dann aufsummiert und nicht nur zuweist. Dann bekommt man das Parsen von sowas wie 4x+2x²+3+5x²+6x+2 quasi geschenkt.
 
Ja stimmt eigentlich, ist wohl zu früh am Morgen für mich, um so zu denken:) Ich werde das gleich heute Mittag ausprobieren, da ich gerade nicht am Computer sitze. Danke dir schonmal, ich werde mich bei Erfolg/Misserfolg melden:)
Ergänzung ()

So, ich habe nun das ganze ein wenig geändert und auf meine Bedürfnisse angepasst, klappt alles wunderbar. Danke die recht herzlich für deine Unterstützung.
 
Eine Frage habe ich noch, wie kann man eine Quadratwurzel aus einer BigDecimal ziehen?
Ich habe es schon mit:
Code:
.pow(1/2)
versucht, allerdings klappt das nicht.
Mit
Code:
Math.sqrt()
geht es auch nicht, da hier ein Double benötigt wird.
 
Rein aus Interesse...
Wenn ich meine BigDecimal d mit
Code:
System.out.printf("Dis.pow: %d", Math.sqrt(d.doubleValue()));
ausgeben lassen will, bekomme ich eine
Code:
Exception in thread "AWT-EventQueue-0" java.util.IllegalFormatConversionException: d != java.lang.Doubl
 
Ist ja auch kein Wunder, weil du versuchst ein double mit %d (für integer) auszugeben.
Ergänzung ()

Es geht zwar auch mit %f, aber für schön formatierte Ausgaben bietet sich DecimalFormat an.
 
Zuletzt bearbeitet:
Oh mann, manchmal sieht man den Wald vor lauter Bäumen nicht:)
In einem anderem System.out... habe ich auch %f genutzt, jetzt geht es, danke:)
 
Zurück
Oben