Moin, ich habe folgenden RegEx Ausdruck:
^P((?<Years>\d+Y)?(?<Months>\d+M)?(?<Days>\d+D)?)(T(?<Hours>\d+H)?(?<Minutes>\d+M)?(?<Seconds>\d*.?\d+S)?)$
Damit soll eine ISO 8601 Duration verifiziert werden.
Im Moment besteht er nur auf die Elemente P und T, aber es sollten noch mindestens eine Gruppe Years, Months, Days, Hours Minutes oder Seconds vorhanden sein.
Nur leider hab ich noch keine Möglichkeit gefunden dieses im RegEx ausdruck zu verlangen
Vielen Dank für jede Hilfe
Der konkrete Code zum TextChange Event:
private void DurationVerifyEvent(object sender, EventArgs e)
{
if (!SecurityToken) return;
TextBox a_textBox = (TextBox)sender;
if (Regex.IsMatch(a_textBox.Text, @"^P((?<Years>\d+Y)?(?<Months>\d+M)?(?<Days>\d+D)?)(T(?<Hours>\d+H)?(?<Minutes>\d+M)?(?<Seconds>\d*.?\d+S)?)$"))
{
errPro.SetError((Control)sender, "");
}
else
{
errPro.SetError((Control)sender, "Wrong format");
}
}
Hallo eXXitus,
in Empfehlung: Fun With .NET Regex Balancing Groups findest du einen Link auf ein Regex-Beispiel unter Verwendung von balancing groups, das ermittelt, ob in einen Passwort Buchstaben aus mindestens 3 verschiedenen Buchstabengruppen enthalten sind. Ich vermute, das ließe sich auf dein Problem übertragen.
Alternativ bleibt dir immer noch die Möglichkeit, per C# zu prüfen, ob der Match mindestens eine gewünschten Gruppen enthält.
herbivore
danke herbivore, genauso was habe ich gesucht.
Den Thread habe ich wohl mit der Suche übersehen.
Ich prüfe es gerade relativ aufwendig per C# und dachte mir das es auch mit RegEx gehen müsste.
Hallo eXXitus,
also bevor du mit Balancing Groups anfängst, solltest du besser bei der Prüfung durch C# bleiben. Ich sehe nicht, warum die aufwändig sein sollte. Eigentlich sollte es reichen, die Success-Properties aller sechs Gruppen mit logischem Oder zu verbinden und wenn insgesamt true rauskommt, ist mindestens eine Gruppe vorhanden:
m.Groups["Years"].Success || m.Groups["Months"].Success || ...
Bei dem konkreten Pattern würde es zudem wohl reichen zu prüfen, ob der gesamte Match länger als zwei ist. Oder man prüft den Eingabestring sogar schon vor dem Matchen auf eine Länge größer als zwei.
herbivore
Danke für die Info =)
ich hätte mich wohl erstmal richtig mit der RegEx Klasse auseinandersetzen sollen, bevor ich mich auf den Ausdruck stürze. Ich wusste nicht das man in C# das Gruppen Success prüfen kann. Vielen Dank !!! (jetzt komm ich mir etwas blöd vor)
Das mit der Länge von 3+ habe ich bisher gemacht, aber was war mir zu unkomfortabel falls sich die Anforderungen später schnell umstellen lassen müssen. 🙂
Das entsprechende RegEx sollte so aussehen:
^
P
(
(?<Years>\d+Y(?<N>))? # If matched, Push To "N"-Stack
(?<Months>\d+M(?<N>))? # If matched, Push To "N"-Stack
(?<Days>\d+D(?<N>))? # If matched, Push To "N"-Stack
)
(
T
(?<Hours>\d+H(?<N>))? # If matched, Push To "N"-Stack
(?<Minutes>\d+M(?<N>))? # If matched, Push To "N"-Stack
(?<Seconds>\d*.?\d+S(?<N>))? # If matched, Push To "N"-Stack
)
$
(?<-N>){1} # Decrement "N"-Stack by one (Cause Match to fail if not at least once pushed to)
Gruß, Christian.