2017-02-04 3 views
1

Ich habe seit einer Stunde mit Regex zu kämpfen. Also, direkt darunter ist mein Text, den ich analysieren möchte.Java Regex Gruppen in Gruppen

AddAgenda("Gangster's agenda", 
{ 
    TEAM_HITMAN, 
    TEAM_POLICE 
}, 
{ 
    TEAM_GANG, 
    TEAM_MAFIA, 
    TEAM_GANGSTER 
}) 

Ich mag würde die Agenda Namen erfassen, jedes Team INDIVUDUALLY von jedem Paar von geschweiften Klammern. Eine Sache zu wissen ist, dass ich nicht weiß, wie viele Teams es in jedem dieser Paare gibt.

Grundsätzlich möchte ich dies:

Group [1]: 
    Gangster's agenda 
Group [2]: 
    Group [0]: TEAM_HITMAN 
    Group [1]: TEAM_POLICE 
Group [3]: 
    Group [0]: TEAM_GANG 
    Group [1]: TEAM_MAFIA 
    Group [2]: TEAM_GANGSTER 

Aber ich habe kam nur mit auf den Punkt:

AddAgenda\(\"([^"]+)\",\s*\{(\s*([\w_]+,))* 

, welche diese erzeugt:

Group [0]: 
    [0]: AddAgenda("Gangster's agenda", 
{ 
    TEAM_MOB, 
    TEAM_POLICE, 
Group [1]: 
    [0]: Gangster's agenda 
Group [2]: 
    [0]: 
    TEAM_POLICE, 
Group [3]: 
    [0]: TEAM_POLICE, 
+6

Nur eine _parser_ schreiben, die jedes Stück des Eingangs liest und extrahiert die gewünschten Werte. Hast du schon etwas probiert? –

+6

Ich habe nie die Faszination verstanden, solche Dinge mit einer Regex zu tun. Schreiben Sie einfach den Code, mit dem Sie den Text analysieren möchten. Warum es unnötig kompliziert und unleserlich machen? – nhouser9

+1

@ nhouser9 Ich denke, das Problem ist, dass Leute über Regex herausfinden, und dann davon ausgehen, dass es das einzige Werkzeug ist, um Text zu verarbeiten. Weißt du, [alles sieht wie ein Nagel aus] (https://en.m.wikipedia.org/wiki/Law_of_the_instrument). –

Antwort

-1

So etwas wie das?

\"(.*)\"|\s([A-Z_].*) 

https://regex101.com/r/6vJpXe/1

+0

Vielen Dank für Ihre Antwort, aber das Problem ist, dass ich nicht unterscheiden kann, aus welchen Gruppen jedes Team besteht. – x84x4

+0

Ah. Okay. Missverstanden die Frage. –

0

This my try:

AddAgenda\(\"([^"]+)\",\s*\{(\s*([\w_]+)\s*,?\s*([\w_]+)\s*)},\s*{\s*(([\w_]+)\s*,?\s*([\w_]+)?\s*,?\s*([\w_]+)?)\s*}\s*\) 

Also auf Ihre Frage suchen, Gruppe 3,4 von Gruppe enthalten sind 2, Gruppe 6,7,8 (TEAM_GANG, TEAM_MAFIA, TEAM_GANGSTER) sind in Gruppe 5 enthalten.

Das Problem, das wir mit nur einem Regex haben, besteht darin, dass Sie für jedes TEAM nicht automatisch eine neue Erfassungsgruppe generieren können. Um es klar zu stellen, eine Eigenschaft von regulären Ausdrücken besteht darin, dass Sie Quantifizierer auf Muster anwenden können. \ d + isst mehr Ziffern auf. Zum Beispiel erfasst die Regex (\ d) eine Ziffer in Gruppe 1.

Was passiert also, wenn Sie die beiden zusammen in diese Regex setzen?

(\d)+

Die Erfassung Klammern Sie in einem Muster sehen nur eine einzige Gruppe erfassen. Also in (\ d) +, Capture-Gruppen nicht fortfahren, die Übereinstimmung erneut zu wiederholen. Die Regex verweist wiederholt auf die gleiche Gruppe. Wenn Sie (\d)+ regex auf 1234 versuchen, enthält Gruppe 1 4, die letzte Erfassung.

In einer Nussschale wurde die Gruppe 1 jedes Mal überschrieben, wenn die Regex durch die einfangenden Klammern iteriert.

Mit zwei Regex können Sie das Problem in zwei Teile teilen. Passen Sie zuerst die drei Parameter in AddAgenda an. Teilen Sie dann die beiden Parameter in geschweifte Klammern.

First regular Ausdruck könnte sein:

AddAgenda\("([^"]+)",\s*\{\s*([^}]+)\},\s*\{\s*([^}]+)\s*\}\) 

Second regular expression sehr einfach.

([\w_]+) 

In diesem Fall in Java können Sie den folgenden Code ausführen:

Matcher m = Pattern.compile("[\\w_]+").matcher(s); 
while (m.find()) { 
    System.out.println(m.group()); 
} 
+0

Danke für deine Antwort, aber wenn ich ein Team hinzufüge oder lösche, funktioniert deine Regex nicht mehr. – x84x4

+0

Ich habe meine Antwort aktualisiert, diese Version arbeitet mit den fehlenden Teams. – freedev

+0

Funktionierte immer noch nicht wie erwartet, nvm Ich verwende stattdessen nur 2 Regex-Ausdrücke. – x84x4