Problem mit PatternMatch

Maik20

Erfahrenes Mitglied
Hallo

ich habe folgendes Problem mit einem PatternMatcher:

Dazu der folgende Test-String:

Code:
String curtxt = "test test-test - test2 - test3 - test4";

Und folgender Pattern:

Code:
String pattern = "(.*)-(.*)-(.*)";

Ein PatternMatch auf beides Angewendet liefert (leider) true:

Code:
Pattern p = Pattern.compile (pattern, Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher (curtxt);
if (m.find()){
...
}

Ich habe hier zwei Probleme.

1) Warum liefert dieser true? Es sind doch drei " - " in dem Test-String.
2) Die jeweiligen Groups liefern mir:

Code:
m.group(1).trim(); => "test test-test - test2";
m.group(2).trim(); => "test3";
m.group(3).trim(); => "test4";

Das Ergebnis sollte jedoch sein:

Code:
1 = test test-test;
2 = test2;
3 = test3 - test4;

Kann ich das mit einem anderen Pattern abbilden?

Hat hier jemand eine Idee?
 
Ich wüßte nicht wie der Patternmatcher das Ergebnis liefern sollte was du erwartest.

Sehen deine Strings denn immer so aus? Dann erweitere das Pattern so, dass alle Bindestriche im Pattern abgefragt werden.
 
Nein, das ist mein Problem.

Normalerweise sollten eben nur 2 Bindestriche " - " enthalten sein. Ab und zu sind in den Artikelbezeichnungen jedoch 3 Striche drin.

Was ich mich nur Frage warum nimmt der PatternMatcher beim ersten Group die ersten beiden Einträge zusammen?

"test test-test - test2"

Und wie kann ich das verhindern?

Ich könnte prüfen wieviel Bindestriche " - " in dem String sind. Sind es zwei, dann nehme meinen Pattern matcher von oben sind es drei dann nehme?
 
Code:
".........-.....-......................" (Beispiel)
".......................-.......-......" (in deinem Fall)
"test test-test - test2 - test3 - test4"

1) Warum liefert dieser true? Es sind doch drei " - " in dem Test-String.
Du erlaubst alle Zeichen zwischen den Strichen, es müssen lediglich mindestens zwei davon im String enthalten sein.

2) Die jeweiligen Groups liefern mir:
Der Matcher arbeitet in deinem Fall gierig, holt also so viel wie möglich in eine Match-Gruppe rein.
Ein regulärer Ausdruck, der eventuell eher das tut, was du erwartest, könnte so aussehen:
Code:
"^([^-]+)-([^-]+)-([^-]+)$"
Wobei ich gerade nicht weiß, ob der Standard Regex-Matcher in Java die Marker für Zeilenanfang und -ende benötigt und / oder versteht.
 
Hallo,

danke für die Infos. Jedoch habe ich mit diesem Pattern ein anderes Problem:

Code:
"([^-]+)-([^-]+)-([^-]+)"

liefert mir bei diesem String:

Code:
test test-test - test2 - test3 - test4

Leider bei group(1) "test test", sollte aber liefern "test test-test".

Ich habe es auch schon mit
Code:
"([^-]+) - ([^-]+) - ([^-]+)"

versucht allerdings bekomme ich dann nur "test" im group(1).

Noch eine Idee?
 
Zurück