Regexp einer Auflistung

diggaa1984

Top Contributor
Hiho,

ich versuch gerade mir eine parameterliste per regexp in bestandteile zerlegen zu lassen nur irgendwie gibt er mir immer nur den ersten und den letzten eintrag aus :/

Code:
input: param,param2,param3,param4
regexp: (\\w+)(?:,(\\w+))*

output:
start() = 0, end() = 26
group(0) = "param,param2,param3,param4"
group(1) = "param"
group(2) = "param4"

das beispiel ist ein minimalbeispiel, meine parameterliste ist in wirklichkeit viel komplexer und nur teil eines größeren ausdrucks, der vorher komplett matchen muss. Das der Ausdruck matcht ist nicht das Problem, aber ich bekomm wie gesagt nich alle Parameter als einzelne Grupper heraus, was mir die weitere Arbeit ungemein leichter machen würde.

Geht das nicht, oder hab ich was übersehen?
Folgendes wäre ideal:
Code:
output:
start() = 0, end() = 26
group(0) = "param,param2,param3,param4"
group(1) = "param"
group(2) = "param2"
group(3) = "param3"
group(4) = "param4"
 
Zuletzt bearbeitet:
scheint als müsse ich dann sukzessive per #find() durchgehen um die einzelnen teile zu erhalten .. nuja, damit kann ich mich abfinden .. falls es doch direkter geht bin ich gern für Vorschläge offen 🙂
 
ne das ganze wird reichlich komplex, da ist ein Trennzeichen (egal welches) auch in anderer Verwendung möglich, daher die Krücke übers Regexp
 
das kann später wie folgt aussehen:

Code:
anyName(p1{foo},p2{'{a,b}' bar},p3) :: ...

innerhalb der Hochkommas kann alles mögliche stehen, da scheiterts dann mit simper Trennung

ich werde aber wie oben schon erwähnt, die Parameterliste als gesamtes herausziehen und dann mittels Matcher#find() die jeweiligen Parameter einzeln extrahieren (der Regexp dazu entspricht einem einzelnen Parameter)
 
Verstehe, aber die löst dein Ausdruck doch auch (noch) nicht?

Da würde ich mal nach einer csv-Klasse schauen. Wenn es "nur" darum geht, dass Dinge in Anführungszeichen stehen können.
 
Code:
anyName(p1{foo},p2{'{a,b}' bar},p3) :: %p1 => %p2 %p3;

das ist das was ich im Programm vorfinde, wenn diese Zeile matcht (vom Aufbau her korrekt ist)
dann benötige ich daraus: anyName p1{foo} p2{'{a.b} bar} und p3

einen solchen Ausdruck kann ich schon matchen nur dachte ich ich bekomme als Gruppen auch gleich noch die Parameter einzeln, aber das scheint nich der Fall zu sein.
Ich kann bereits anyName, die komplette Parameterliste sowie den Teil hinterm :: nach dem Matchen abfragen, nur die Parameter müssen da noch zerlegt werden um diese programmintern besser zu verwalten.

Das hat eben ne gewisse Komplexität, da is Regexp schon recht handlich 🙂
 
Code:
anyName(p1{foo},p2{'{a,b}' bar},p3) :: %p1 => %p2 %p3;

das ist das was ich im Programm vorfinde, wenn diese Zeile matcht (vom Aufbau her korrekt ist)
dann benötige ich daraus: anyName p1{foo} p2{'{a.b} bar} und p3

einen solchen Ausdruck kann ich schon matchen nur dachte ich ich bekomme als Gruppen auch gleich noch die Parameter einzeln, aber das scheint nich der Fall zu sein.
Ich kann bereits anyName, die komplette Parameterliste sowie den Teil hinterm :: nach dem Matchen abfragen, nur die Parameter müssen da noch zerlegt werden um diese programmintern besser zu verwalten.
Wenn Du schon die dreiteilung per Regex hast kannst Du doch einfach den mittleren Teil weiter verarbeiten. Ist das zwischen a und b ein Punkt oder Komma? Sind es immer drei Parameter in den Klammern bzw. wie sieht das Schema darin aus?
 
also der aufbau is wie folgt:

  • belieberName
    Code:
    (\\w+)
  • parameterliste mit mindestens einem Parameter, aber beliebig viele (getrennt durch Komma)
  • trennung zwischen linker und rechter Seite mittels
    Code:
    ::
  • auf der rechten Seite dann ein String
    Code:
    (.*)
    , welcher angibt wie ein Resultat aussehen soll (Transformation eines baumes)


ein parameter sieht wie folgt aus:

Bezeichner und dahinter optional ein geschweiftes Klammernpaar
Code:
(\\w+)(\\{((\'.*?\')|([^}]))*\\})?

in dem Klammernpaar dann beliebige Zeichenketten, wobei spezielle Markierung durch Hochkommas möglich sind

EDIT: mit dem regExp hier für den einzelnen Parameter kann ich die Liste der Parameter ja mittels
Code:
#find()
durchgehen und erhalte in
Code:
#group(0)
immer den kompletten Parameterausdruck, das reicht ja dann um ihn Per Hand zu zerlegen (Bezeichner und notfalls Spezifikation in {})
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben