Regulärer Ausdruck gesucht

Radditz

Admiral Special
Mitglied seit
12.09.2002
Beiträge
1.202
Renomée
19
Standort
Wuppertal
Moin,

ich suche einen Ausdruck (in C#) was ganz einfaches beschreiben soll:

Ein Feld soll mit via Semikolon-getrennten Werten gefüllt sein. Daneben soll es noch Bindestriche geben, die einzelne Bereiche definieren.

Sowas soll möglich sein:

Code:
23;42;45-34;21

Sowas hingegen nicht:

Code:
23-42-45;34;21
(zu viele Bindestriche hintereinander)

Bislang habe ich so etwas formuliert, allerdings funktioniert es bei beiden eben genannten Beispielen, was ja nicht sein soll:

Code:
assignReg = new Regex(@"[0-9]+((\;[0-9]+)+(\-[0-9]+)?)*");

Ich hab's stark vereinfacht, so dass es eigentlich schon bei Angabe von nur einem Bereich (z.B. 23-42) fehlschlagen sollte, aber nicht mal das tut es. Wo liegt der Fehler?
 
Ich denke, es ist logisch, dass der Ausdruck matcht, weil er irgendwo sucht und auch findet - vermutlich bei/ab der "34;". Einen String-/Ausdrucksanfang festzulegen, kann evtl. helfen.

MfG Dalai
 
Versuch mal den hier:

Code:
(([0-9]+-[0-9]+[^-])|[^-]+[0-9]+;{0,1})*

Geht aber vielleicht auch noch einfacher.
 
"so dass es eigentlich schon bei Angabe von nur einem Bereich (z.B. 23-42) fehlschlagen sollte, aber nicht mal das tut es. Wo liegt der Fehler?"

dein Verbatim-Ausdruck kann nicht in der von dir angedachten Weise fehlschlagen, weil der aufgestellte Ausdruck [0-9]+((\;[0-9]+)+(\-[0-9]+)?)* einen String findet, wenn er besteht aus:

Code:
[0-9]+  mindestens eine Zahl zwischen 0 und 9, gefolgt von
und zwar optional wegen dem auf die äussere Klammer folgenden *, was beliebige Anzahl, auch 0 bedeutet
das erklärt bereits, dass der Ausdruck jede Zahl findet (auch so etwas: "aaaa9bbb");
also gefolgt von
--------
((\;  einem Semikolon, gefolgt von
[0-9]+)+ einer mindestens einstelligen Zahl,
wobei das Semikolon mit anschliessender mindestens einstelliger Zahl mindestens einmal vorkommt, OPTIONAL (wegen ?) gefolgt von
(\-[0-9]+)?  einem Bindestrich mit einer anschliessenden mindestens einstelligen Zahl
)*  das hier macht den ganzen Ausdruck wie schon oben gesagt ab dem eingefügten Strich optional





ich hätte auf die Schnelle einen eigenen Vorschlag:

\<(([1-9]([0-9])?) | \2[-]\2)([;]\1)?(\4)?\>

diese regex sollte jeden Ausdruck finden, der
\<  an einem Wortanfang steht gefolgt von
(
([1-9]([0-9])?)  einer mindestens einstelligen und höchstens zweistelligen Zahl, die nicht mit 0 beginnt
|  oder
\2[-]\2 einer mindestens einstelligen Zahl, die nicht mit 0 beginnt gefolgt von einem Bindestrich und wiederum einer mindestens einstelligen Zahl, die nicht mit 0 beginnt
(das sind zwei Rückwärtsreferenzen, die sich auf den von der Regex-Maschine automatisch gespeicherten Inhalt der insgesamt zweiten, daher \2, öffnenden Klammer von links gesehen, bezieht; optional gefolgt von
([;]\1)? einem Semikolon an das sich der gesamte Treffer-Inhalt anschliesst, der durch den Teil des Ausdrucks gefunden wird, der sich in der von links ersten öffnenden Klammer befindet, man lasse das ? weg, wenn der Teil des Ausdrucks nicht optional sondern obligatorisch sein soll, also 9 ausgelassen wird und 9;9 gefunden wird; 
gefolgt (wiederum optional) von:
(\4)? dem Treffer-Inhalt, der durch den Ausdruck geliefert wird, der sich in der vierten von links öffnenden Klammer(ebene) befindet, i.e. durch den Ausdruck ([;]\1); gefolgt von:
\> einem Wortende, i.e. .....23abc wird ausgelassen

die Rückwärtsreferenzen funktionieren meines Wissens nach in C
 
Zuletzt bearbeitet:
Zurück
Oben Unten