[Regulärer Ausdruck] Auf Gruppe mit Quantifier separat zugreifen?

Perpetuum

Neues Mitglied
Hallo Java-Forum!

Ich habe folgenden String den ich mit dem angegeben reguläre Ausdruck überprüfen und gleichzeitig einige Daten rausziehen möchte :

String: aktuelleMitspieler(("Spielername1", vi), ("Spielername2", gr), ...).

Java:
String player = "\\(\".*\",\\s*(?:vi|gr|ge|or|ro)\\)";
String regex = "aktuelleMitspieler\\((" + player + ",\\s*){0,4}(" + player + ")\\)\\.";

Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(message);
m.find();

for(int j = 0; j <= m.groupCount(); j++) {
     System.out.println(m.group(j));
}

Das Problem ist, wenn er z. B. drei Spieler im String hat, die erste Gruppe nicht jeweils separat gefunden wird, sondern kokateniert as ein String.

Beispiel: aktuelleMitspieler(("Spielername1", vi), ("Spielername2", gr), ("Spielername3", ro)).

Die erse gefundene Gruppe ist ("Spielername1", vi), ("Spielername2", gr), und die zweite ("Spielername3", ro).

Warum wird die Gruppe nicht separat angegeben?

Viele Grüße
Perpetuum
 
ohne mich jetzt weiter in dein RegEx reinzudenken, einfach mal die Frage vorweg: warum splittest du das nicht einfach in ein array?
 
Er nimmt den größtmöglichen Fund, der nicht mit zwei Klammern schließt, und das ist ("Spielername1", vi), ("Spielername2", gr).

(" am Anfang, dann beliebige Zeichen zwischen "" bis zum Beistrich; trifft zu auf:
("Spielername1", vi), ("Spielername2"

Dann können noch ein Beistrich, beliebig viele Weißzeichen und vi, gr, ge, or, oder ro kommen, dann eine Klammer und ein Punkt; trifft zu auf:
, gr)“.

Nun weißt Du, was Du wolltest, und das hast Du bekommen. 😉
Dieses „gierige“ Verhalten kannst Du ändern, wenn Du ein weiteres Fragezeichen einfügst:
String player = "\\(\".*?\",\\s*(?:vi|gr|ge|or|ro)\\)";

Allerdings bekommst Du deswegen nicht alle Spieler einzeln, denn wenn eine Gruppe mehrfach zutrifft, kann man nur auf die letzte zugreifen.
 

Neue Themen


Zurück
Oben