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
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!"
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
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.
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
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