[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