Laden...

Regex: Alle Zeichen zwischen Bindestrich und "bis" entfernen

Erstellt von Debiii vor 9 Jahren Letzter Beitrag vor 9 Jahren 5.297 Views
D
Debiii Themenstarter:in
19 Beiträge seit 2014
vor 9 Jahren
Regex: Alle Zeichen zwischen Bindestrich und "bis" entfernen

Hey liebe Community,

ich hätte da eine Frage bezüglich dem Regex in C#.

Ich habe das folgende Übungsbeispiel und die Regex dazu, was nicht funktioniert.^^

string text = "Hallo mein Name ist Jan - besuche noch die Schule bis nächstes Jahr";

Match = Regex.Match(text, @"[A-Za-z0-9]");

Ich weiß das der Regex blödsinning ist, aber wie kann ich es hin bekommen, einen Regex zu definieren, mit dem ich Alle Zeichen bis (bindestrich, also "-") auslese und dann alle Zeichen nach dem Wort "bis". Und der Rest der Zeichenkette die übrig bleibt sollen entfernt werden. Ist mein erstes mal mit Regex.

Ich wäre über Tipps und Ratschläge sehr dankbar 😃

Ps. Ich weiss das dieser Fall mit Substring zu lösen ist,aber ich möchte das umbeding über einen Regex regeln. Das ich ein algemeines Muster für diese Fälle habe

16.807 Beiträge seit 2008
vor 9 Jahren

Bitte beschäftige Dich ein paar Stunden mit Regex, dann kannst Du das Problem alleine lösen.
[Artikel] Regex-Tutorial

Das Forum ist kein Pattern-Generator.
[Hinweis] Wie poste ich richtig? Punkte 4

49.485 Beiträge seit 2005
vor 9 Jahren

Hallo Debiii,

wenn es darum geht, einen bestimmten Teil aus einem String zu entfernen, ist der normale Ansatz, einen Pattern zu schreiben, der auf den zu entfernenden Teil passt und ihn dann mit Regex.Replace durch einen leeren String zu ersetzen und somit zu entfernen.

In deinem Fall ist der zu entfernende Text durch Begrenzer (Bindestrich und "bis") definiert. Wenn die Begrenzer jeweils nur einmal vorkommen und wenn sie mit entfernt werden sollen, ist es im Grunde ganz einfach: Begrenzer1.*Begrenzer2

Wenn die Begrenzer nicht entfernt werden sollen, müsste man den Pattern so schreiben, dass er nur auf den Text zwischen den Begrenzern passt. Trotzdem müssen die Begrenzer in dem Pattern natürlich trotzdem irgendwie auftauen, den es ist ja nur durch sie definiert, welcher Text dazwischen liegt. Was wie ein Widerspruch klingt ist keiner, weil man für die Anwesenheit der Begrenzer positive Lookaheads - und behinds verwenden kann. Das ist aber für Regex-Anfänger möglicherweise nicht so ganz leicht zu durchschauen bzw. anzuwenden.

Deshalb kann man auch den Pattern aus dem zweiten Absatz verwenden, aber als Ersetzungstext nicht den leeren String sondern "Begrenzer1Begrenzer2" einsetzen.

Es gibt natürlich noch andere Möglichkeiten, das Ziel zu erreichen. Letztlich ist es eine Frage der persönlichen Vorlieben. Es würde also auch mit Regex.Match gehen, wenn man anschließend die beiden Matches verkettet. Ich persönlich fände das hier aber weniger passend.

Schwieriger wird es, wenn die Begrenzer auch an anderen Stellen auftauchen können, z.B. in "Hallo mein Name ist Hans-Peter - besuche noch die Schule bis nächstes Jahr" wo in dem Namen "Hans-Peter" ebenfalls ein Bindestrich auftaucht. Wie man das löst, hängt dann von den genauen Umständen ab. Im konkreten Fall würde es reichen " - " statt einfach nur "-" als Begrenzer zu verwenden.

herbivore