Laden...

Regulärer Ausdruck zum Auslesen von Werten zwischen [ ]

Erstellt von flacker vor 9 Jahren Letzter Beitrag vor 9 Jahren 3.295 Views
F
flacker Themenstarter:in
33 Beiträge seit 2014
vor 9 Jahren
Regulärer Ausdruck zum Auslesen von Werten zwischen [ ]

Hallo,

ich habe eine Textbox in der ich Text der folgenden Form akzeptieren möchte:

[wert];[wert;wert];[wert];.... usw

Jetzt möchte ich gern den Text zwischen den eckigen Klammern auslesen. Dafür sind ja reguläre ausdrücke geeignet, nur leider schaffe ich es im moment nicht den richtigen Ausdruck zu finden.

Mit freundlichen Grüßen

flacker

6.911 Beiträge seit 2009
vor 9 Jahren

Hallo flacker,

schau dir dazu mal das Tool On-the-fly Regex-Tester: Regex-Lab an. Damit und dessen F1-Hilfe solltest du es schaffen. Sonst melde dich wo du genau hängst.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

F
flacker Themenstarter:in
33 Beiträge seit 2014
vor 9 Jahren

Also ich habe jetzt den Ausdruck herraus welche mit immer einen Ausdruck liefert

 .*\[(?<match>.*)\].*

Zumindestens sagt das Tool dies. Jetzt ich aber gern alle werte haben und nicht nur einen

2.079 Beiträge seit 2012
vor 9 Jahren

Das nennt sich gieriges Verhalten.

Es wird dir alles zwischen einer geöffneten und einer geschlossenen eckigen Klammer zurück gegeben, in diesem Fall also die erste Geöffnete und die letzte Geschlossene.

Du musst daher anstelle aller Zeichen nur die zu lassen, die keine geschlossene eckige Klammer sind.

Ich kann es gerade nicht testen, aber probier mal das:

.*\[(?<match>^\]*)\].*

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

1.346 Beiträge seit 2008
vor 9 Jahren

Ich würde so daran gehen:

Was du ja haben willst, ist das du alles zwichen [] finden willst. Also brauchst du auf jedenfall etwas der Form [xxx]. Jetzt willst du den Inhalt in den Klammern schlussendlich lesen, also packst du da eine entsprechende Gruppe dafür rein [(?<match>xxx)]. Jetzt wär es sinnvoll eine möglichst Präzise Beschreibung des Inhaltes zu bekommen. Welche Zeichen dürfen in der Klammer sein? Das sind alle, außer [ und ]. Also hast du für den INhalt die Beschreibung [[]], und das darf sich natürlich beliebig oft wiederholen, so fehlt noch ein * dahinter. dadurch erhällst du den Ausdruck [(?<match>[[]])]. Damit findest du jetzt schon eine Klammer. Jetzt musst du probieren, durch wiederholung alle Klammern zu finden. Zwichen den Klammern darf ja alles stehen, außer [ und ]. Also Matcht [(?<match>[^[]])][[]]* einen Klammerausdruck, und den Bereich bis zum nächsten. Und das ist genau was du willst. denn ab da kannst du den Asdruck wieder von vorne anwenden. Also fehlen nur noch einmal ein * dahinter und der Ausdruck sollte passen: ([(?<match>[[]])][^[]])*

Es sieht wirklich komplizierter aus als es ist, vorallem durch die vielen Klammern. Aber so gehe ich vor wenn ich einen solchen Ausdruck aufstelle.

LG pdelvo

49.485 Beiträge seit 2005
vor 9 Jahren

Hallo flacker,

Jetzt ich aber gern alle werte haben und nicht nur einen

alle Matches bekommt man mit Regex.Matches (statt Regex.Match). Voraussetzung ist natürlich, dass der Pattern für sich genommen jeweils nur auf einen Wert bzw. ein Klammerpaar passt.

Bitte schau auch in [Artikel] Regex-Tutorial.

herbivore