Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

RegEx: Wie sage ich das in einem Ausdruck eines von 6 Elementen vorhanden sein muss (für ISO 8601)
eXXitus
myCSharp.de - Member



Dabei seit:
Beiträge: 8

Themenstarter:

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

beantworten | zitieren | melden

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");
            }
        }
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
eXXitus
myCSharp.de - Member



Dabei seit:
Beiträge: 8

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
eXXitus
myCSharp.de - Member



Dabei seit:
Beiträge: 8

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
TheBrainiac
myCSharp.de - Member

Avatar #avatar-3152.png


Dabei seit:
Beiträge: 832
Herkunft: /dev/null

beantworten | zitieren | melden

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"
private Nachricht | Beiträge des Benutzers
eXXitus
myCSharp.de - Member



Dabei seit:
Beiträge: 8

Themenstarter:

beantworten | zitieren | melden

cool danke für die Antwort :)
private Nachricht | Beiträge des Benutzers