expertenaustausch > microsoft.* > microsoft.german.entwickler.dotnet.framework

Armin Zingler (28.04.2010, 15:07)
Hi,

nachdem ich die Regex-Doku jetzt x-fach rauf und runter
durchsucht habe und immer noch keinen Einstiegspunkt gefunden habe,
frage ich mal hier:

Ich habe Text nach folgendem Format: (ist noch kein regulärer Ausdruck)

"*" def "*" [jkl "*"[*]]"

Wobei "*" Platzhalter für igendeinen Text sind und "[]" optionaler
Text ist.

Beispiel:

"abc" def "ghi" [jkl "mno" [pqr]]"

Ich möchte in diesem Beispiel die Texte
- abc
- ghi
- mno
- pqr

extrahieren. Welchen reg. Ausdruck muss ich dafür verwenden?
Bei der Doku fehlt mir der Einstieg. So etwas wie "Platzhalter" finde
ich nicht. Nur irgendwelche Begriffe wie "Ersetzungen" und "Quantifizierer",
die nicht wirklich erklärt werden. Brauche ich die? Wonach muss
ich suchen? Ich habe keine Ahnung.
Tobias Burger (28.04.2010, 15:52)
Hallo Armin,

bin mir jetzt nicht sicher, ob ich die Vorgaben richtig Verstanden habe:
* Text darf nur aus alphanumerischen Zeichen bestehen
* Text muss in doppelten Anführungszeichen oder in eckigen Klammern stehen

Dann könnte das Regex-Muster so aussehen:
["\[](\w+)["\]]

Ich kann dir für das Prototyping von Regex-Ausdrücken einen Regex-Editor
wärmstens empfehlen. Damit kannst du rasch Patterns auf ihre Gültigkeit
überprüfen und erhältst Hilfe zu deinem Muster...
Ich verwende dafür beispielsweise Expresso ().
Das Erstellen der Regex-Instanz kann so ein Werkzeug auch gleich übernehmen
(wenn nötig kann es die Expression sogar in eine Assembly kompilieren):
Regex regex = new Regex("[\"\\[](\\w+)[\"\\]]");

MfG
Tobias

"Armin Zingler" <az.nospam> schrieb im Newsbeitrag
news:3804
[..]
Armin Zingler (28.04.2010, 17:08)
Am 28.04.2010 15:52, schrieb Tobias Burger:
[..]
> Das Erstellen der Regex-Instanz kann so ein Werkzeug auch gleich übernehmen
> (wenn nötig kann es die Expression sogar in eine Assembly kompilieren):
> Regex regex = new Regex("[\"\[](\w+)[\"\]]");


Danke dir.

Mittlerweile ist der Groschen gefallen. Es haperte nur beim Einstieg.

Mein Muster

"*" def "*" [jkl "*"[*]]"

hab ich jetzt übersetzt nach

"(?<group1>\w+)" def "(?<group2>\w+)"( jkl "(?<group3>\w+)")?

Müsste stimmen, oder? Es funktioniert damit, also scheint es richtig
zu sein. :) Mit

m = ex.match(...)
m.group("group1").value

kann ich dann auf die gesuchten Gruppen zugreifen.
Tobias Burger (29.04.2010, 08:49)
Hallo Armin,

freut mich, dass du die Regex-Kurve so langsam kriegst...

Also wenn es sich bei def und jkg um konstante Werte handelt und deine
einzigen Variablen die Sternchen sind, dann sollte es mit folgendem Pattern
klappen:
"(?<group1>\w+)" def "(?<group2>\w+)"(?: \[jkl "(?<group3>\w+)"(?:
\[(?<group4>\w+)\])?\])?
Ich war mir eben nicht sicher wie variabel dein Muster sein kann...

Das oben genannte Pattern matcht:
"abc" def "ghi" [jkl "mno" [pqr]] -> abc, ghi, mno, pqr
"abc" def "ghi" [jkl "mno"] -> abc, ghi, mno
"abc" def "ghi" -> abc, ghi

MfG
Tobias

"Armin Zingler" <az.nospam> schrieb im Newsbeitrag
news:a980
[..]
Ähnliche Themen