Zo heb je een maand geen regex vragen, en zo heb je er twee op een avond 
In dit geval gaat het om regular expressions in .NET 2.0.
Ik zit met het volgende. Ik wil een opgegeven tijdspanne kunnen parsen van de vorm "(dagen)d(uren)h(minuten)", bijv. "12d6h33m" - dit is dan 12 dagen, 6 uur en 33 minuten.
Nu is het zo dat elk van de drie componenten (dagen, uren, minuten) optioneel is, maar dat er minimaal 1 van de 3 aanwezig moet zijn, en wanneer er meer dan 1 aanwezig zijn, dat ze wel in bovenstaande volgorde worden opgegeven. Dus "12d33m" en "6h" zijn beide geldig, maar "33m6h", "24h3h" en "" zijn niet geldig.
De regex die ik hiervoor bedacht heb is:
Zoals je ziet bevat elk component een non-capturing group met resp. d, h of m erin, en daarbinnen een capturing group die alleen de decimalen captured. (in .NET wordt "(?: ... )" gebruikt om een non-capturing group aan te duiden).
Nu is het probleem dat bovenstaande regex ook de lege string matcht, omdat elk van de componenten optioneel is. Hoe krijg ik de regex nu zover dat hij minimaal 1 component wil zien?
Ik zou er een choice van kunnen maken: (a|b|c){1,3} maar dan vervalt de eis dat de componenten in de juiste volgorde gespecificeerd moeten worden...
Alvast bedankt!
In dit geval gaat het om regular expressions in .NET 2.0.
Ik zit met het volgende. Ik wil een opgegeven tijdspanne kunnen parsen van de vorm "(dagen)d(uren)h(minuten)", bijv. "12d6h33m" - dit is dan 12 dagen, 6 uur en 33 minuten.
Nu is het zo dat elk van de drie componenten (dagen, uren, minuten) optioneel is, maar dat er minimaal 1 van de 3 aanwezig moet zijn, en wanneer er meer dan 1 aanwezig zijn, dat ze wel in bovenstaande volgorde worden opgegeven. Dus "12d33m" en "6h" zijn beide geldig, maar "33m6h", "24h3h" en "" zijn niet geldig.
De regex die ik hiervoor bedacht heb is:
code:
1
| (?:(\d+)d)?(?:(\d+)h)?(?:(\d+)m)? |
Zoals je ziet bevat elk component een non-capturing group met resp. d, h of m erin, en daarbinnen een capturing group die alleen de decimalen captured. (in .NET wordt "(?: ... )" gebruikt om een non-capturing group aan te duiden).
Nu is het probleem dat bovenstaande regex ook de lege string matcht, omdat elk van de componenten optioneel is. Hoe krijg ik de regex nu zover dat hij minimaal 1 component wil zien?
Ik zou er een choice van kunnen maken: (a|b|c){1,3} maar dan vervalt de eis dat de componenten in de juiste volgorde gespecificeerd moeten worden...
Alvast bedankt!