Gast
2009-07-08, 18:51:08
Hallo!
Ich bin jetzt schon den halben Tag dabei, ein Regex-Pattern (für .NET) zu finden, welches folgendendermaßen agiert.
Obere Zeile die Eingabe, darunter die Matches welche rauskommen sollen (durch Komma getrennt):
1.
!befehl param1 param2
!befehl, param1, param2 (3 Treffer)
2.
!befehl param1 pa ram2
befehl, param1, pa, ram2 (4 Treffer)
3.
!befehl param1 "pa ram2"
!befehl, param1, pa ram2 (3 Treffer)
4.
!befehl param1, "pa ram2
!befehl, param1, "pa, ram2 (4 Treffer)
Randnotiz: die Parameterliste soll dynamisch lang sein, also keine Beschränkung auf nur 2 Params wie in meinen Beispielen. Es dürfen auch 0 Parameter vorkomen, sprich nur der Befehl dastehen.
Ich denke, es ist ersichtlich, was erreicht werden soll. Der erste Treffer soll der Befehl sein (das erste Wort also), der zweite Treffer das darauffolgende Wort usw.
Leerstelle bedeutet, es fängt ein neues Wort an, es sei denn, es werden Anführungszeichen benutzt. Wurde nur ein Anfürhungszeichen angegeben und das öffnende bzw. schließende vergessen, so bewirkt das nichts und das Anführungszeichen gehört zum Text.
Was daran kompliziert sein soll? Ich verzweifle gerade!
Okay, der Befehl sollte kein Problem sein, den Anfang könnte man evt. so machen:
(![\w]+)
Aber bei den Parametern gehts dann los. Einfachheitshalber wollte ich das ganze erstmal ohne die optionalen Anführungszeichen hinbekommen. (Das (?: ... bedeutet in .NET, dass die Gruppe nur zur Regexlogik gehört und nicht extrahiert wird.)
^(![\w]+)(?:\s(\w+))*$
Problem: es gbt immer exakt 2 Treffer, egal, ob ich 0 oder 100 Parameter angebe. Bei 0 Params hätte ich gerne auch nur ein Ergebnis (nämlich der Befehl), bei 100 params entsprechend 101. Klar, ich hab ja auch 2 Klammern gesetzt (die eine zählt ja nicht wegen ?: ), aber für was setze ich dann den Sternoperator für die Parameter?
Unabhängig davon bekomme ich es nicht hin, die optionalen Anführungszeichen einzubauen. Der oder-Operator war auf den ersten Blick hilfreich, aber seht selbst:
(\w+)|"([\w\s]+)"
Dieser fischt mir zwar, unabhängig davon ob Anführungszeichen benutzt wurden oder nicht, immer schön den Parameter raus (falls nötig von eben diesen Anführunsgzeichen befreit), aber es existiert daneben auch immer ein leeres ("") Ergebnis, schließlich habe ich ja 2 Klammern gesetzt. Ersetze ich die 2 Klammern durch eine große Klammer um alles drumrum, so habe ich zwar wie gewünscht nur ein Ergebnis, aber dafür werden die Anführungszeichen nicht entfernt.
MANNN!!!!!
Bitte helft mir :(
Ich bin jetzt schon den halben Tag dabei, ein Regex-Pattern (für .NET) zu finden, welches folgendendermaßen agiert.
Obere Zeile die Eingabe, darunter die Matches welche rauskommen sollen (durch Komma getrennt):
1.
!befehl param1 param2
!befehl, param1, param2 (3 Treffer)
2.
!befehl param1 pa ram2
befehl, param1, pa, ram2 (4 Treffer)
3.
!befehl param1 "pa ram2"
!befehl, param1, pa ram2 (3 Treffer)
4.
!befehl param1, "pa ram2
!befehl, param1, "pa, ram2 (4 Treffer)
Randnotiz: die Parameterliste soll dynamisch lang sein, also keine Beschränkung auf nur 2 Params wie in meinen Beispielen. Es dürfen auch 0 Parameter vorkomen, sprich nur der Befehl dastehen.
Ich denke, es ist ersichtlich, was erreicht werden soll. Der erste Treffer soll der Befehl sein (das erste Wort also), der zweite Treffer das darauffolgende Wort usw.
Leerstelle bedeutet, es fängt ein neues Wort an, es sei denn, es werden Anführungszeichen benutzt. Wurde nur ein Anfürhungszeichen angegeben und das öffnende bzw. schließende vergessen, so bewirkt das nichts und das Anführungszeichen gehört zum Text.
Was daran kompliziert sein soll? Ich verzweifle gerade!
Okay, der Befehl sollte kein Problem sein, den Anfang könnte man evt. so machen:
(![\w]+)
Aber bei den Parametern gehts dann los. Einfachheitshalber wollte ich das ganze erstmal ohne die optionalen Anführungszeichen hinbekommen. (Das (?: ... bedeutet in .NET, dass die Gruppe nur zur Regexlogik gehört und nicht extrahiert wird.)
^(![\w]+)(?:\s(\w+))*$
Problem: es gbt immer exakt 2 Treffer, egal, ob ich 0 oder 100 Parameter angebe. Bei 0 Params hätte ich gerne auch nur ein Ergebnis (nämlich der Befehl), bei 100 params entsprechend 101. Klar, ich hab ja auch 2 Klammern gesetzt (die eine zählt ja nicht wegen ?: ), aber für was setze ich dann den Sternoperator für die Parameter?
Unabhängig davon bekomme ich es nicht hin, die optionalen Anführungszeichen einzubauen. Der oder-Operator war auf den ersten Blick hilfreich, aber seht selbst:
(\w+)|"([\w\s]+)"
Dieser fischt mir zwar, unabhängig davon ob Anführungszeichen benutzt wurden oder nicht, immer schön den Parameter raus (falls nötig von eben diesen Anführunsgzeichen befreit), aber es existiert daneben auch immer ein leeres ("") Ergebnis, schließlich habe ich ja 2 Klammern gesetzt. Ersetze ich die 2 Klammern durch eine große Klammer um alles drumrum, so habe ich zwar wie gewünscht nur ein Ergebnis, aber dafür werden die Anführungszeichen nicht entfernt.
MANNN!!!!!
Bitte helft mir :(