Laden...

RegEx: Wie sage ich das in einem Ausdruck eines von 6 Elementen vorhanden sein muss (für ISO 8601)

Erstellt von eXXitus vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.783 Views
E
eXXitus Themenstarter:in
7 Beiträge seit 2013
vor 10 Jahren
RegEx: Wie sage ich das in einem Ausdruck eines von 6 Elementen vorhanden sein muss (für ISO 8601)

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");
            }
        }
49.485 Beiträge seit 2005
vor 10 Jahren

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

E
eXXitus Themenstarter:in
7 Beiträge seit 2013
vor 10 Jahren

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.

49.485 Beiträge seit 2005
vor 10 Jahren

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

E
eXXitus Themenstarter:in
7 Beiträge seit 2013
vor 10 Jahren

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. 🙂

795 Beiträge seit 2006
vor 10 Jahren

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.

`There are 10 types of people in the world: Those, who think they understand the binary system Those who don't even have heard about it And those who understand "Every base is base 10"`
E
eXXitus Themenstarter:in
7 Beiträge seit 2013
vor 10 Jahren

cool danke für die Antwort 😃