lindsey: Reguläre Ausdrücke

Also ich versuche einen Regulären Ausdruck zu finden der folgendes überprüft:

Der String muss 8 zeichen lang sein.
es müssen mindestens 2 grossbuchstaben enthalten sein
es müssen mindestens 2 kleinbuchstaben enthalten sein
es müssen mindestens 2 ziffern enthalten sein

if(ereg ("([a-z]{2,}|[A-Z]{2,}|[0-9]{2,})",$string) && strlen($string) >= 8) {
}

das ist mein bisheriger Versuch, aber irgendwie macht er nicht das richtige ^^

da ich mit den regulären Ausdrücken noch nicht so zusammenkomme, und ich mit der Suche auch nichts gefunden hab das mir weiterhilft, hoffe ich das  hier jemand ist der sich mit regulären Ausdrücken auskennt ^^

mfg lindsey

  1. Moin!

    Also ich versuche einen Regulären Ausdruck zu finden der folgendes überprüft:

    Der String muss 8 zeichen lang sein.
    es müssen mindestens 2 grossbuchstaben enthalten sein
    es müssen mindestens 2 kleinbuchstaben enthalten sein
    es müssen mindestens 2 ziffern enthalten sein

    Sowas kann man nach meiner Meinung nicht in _einem_ regulären Ausdruck unterbringen.

    Die Stringlänge auf 8 zu prüfen sollte nicht Aufgabe eines regulären Ausdrucks sein - hast du ja auch schon passend eingebaut.

    Und das Prüfen auf enthaltene Zeichen in passender Stückzahl und insbesondere in beliebiger Reihenfolge ist mit regulären Ausdrücken nur schwierig darstellbar. Ich würde stattdessen empfehlen, den String Zeichen für Zeichen durchzugehen, jedes Zeichen auf Zugehörigkeit zu einer deiner drei Kategorien zu prüfen (Vergleich des ASCII- oder Unicode-Codes) und das einfach zu zählen - wenn hinterher alle drei Zähler größer als 2 sind, ist deine Bedingung erfüllt.

    - Sven Rautenberg

    --
    My sssignature, my preciousssss!
    1. ich habe auch schon probiert das ganze mit 3 Ausdrücken zu überprüfen, also

      ereg ("[a-z]{2,}|",$string) && ereg ("[A-Z]{2,}|",$string) ....

      aber er sucht immer nach 2 Zeichen die hintereinanderstehen, kann man das nicht ändern?

      thx, mfg lindsey

      1. Hi,

        aber er sucht immer nach 2 Zeichen die hintereinanderstehen, kann man das nicht ändern?

        ich kenn mich nicht allzu gut damit aus, aber die Frage ist wie denn die RegExp-Engine das verarbeitet. Selbst wenn es pro Ausdruck nur eine einzelne Schleife wäre, dann wären 3 Ausdrücke 3 Schleifen. Da bist du mit einer Schleife+Zählen um mindestens den Faktor 3 besser bedient...

        MfG
        Rouven

        --
        -------------------
        ie:| fl:| br:> va:| ls:& fo:) rl:( n4:{ ss:) de:] js:| ch:? mo:} zu:|
        1. Sali,

          Ist es möglich die Länge des Strings zu prüfen, Ja. (Hehe, sogar ohne Reguläre Ausdrücke :))

          Ist es möglich das Vorkommen von 2 Ziffern zu prüfen? Ja.
          Das Pattern "\d" muss auf den String angewendet mindestens
          zwei Matches bringen. Oder?

          Wie sieht es mit [A-Z] als Pattern bei Pühapü-Regulären Ausdrücken aus?
          Sollte auch wieder 2 Matches bringen, wenn zwei Grossbuchstaben drin sind. Oder?

          Und wozu Schleifchen? Die gehören in die Haare. :)

          Ciao, Frank

    2. gudn tach!

      Der String muss [mind.] 8 zeichen lang sein.
      es müssen mindestens 2 grossbuchstaben enthalten sein
      es müssen mindestens 2 kleinbuchstaben enthalten sein
      es müssen mindestens 2 ziffern enthalten sein

      Sowas kann man nach meiner Meinung nicht in _einem_ regulären Ausdruck unterbringen.

      doch es geht, und zwar mit vielen oder-verknuepfungen oder mit hilfe von zero-width positive look-aheads:

      /(?=.*[A-Z].*[A-Z])(?=.*[a-z].*[a-z])(?=.*\d.*\d)/

      mit laengenpruefung:

      /(?=.*[A-Z].*[A-Z])(?=.*[a-z].*[a-z])(?=.*\d.*\d).{8,}/

      (hab's nicht getestet, bin aber der meinung, dass das so funzen sollte.)

      Die Stringlänge auf 8 zu prüfen sollte nicht Aufgabe eines regulären Ausdrucks sein

      kommt darauf an. was in diesem fall besser (schneller in der ausfuehrung) waere, weiss ich nicht. schneller getippt ist jedenfalls ".{8,}".

      Und das Prüfen auf enthaltene Zeichen in passender Stückzahl und insbesondere in beliebiger Reihenfolge ist mit regulären Ausdrücken nur schwierig darstellbar.

      kommt auf die genauen anforderungen an. in diesem fall find ich es noch recht ueberschaubar.

      Ich würde stattdessen empfehlen, den String Zeichen für Zeichen durchzugehen, jedes Zeichen auf Zugehörigkeit zu einer deiner drei Kategorien zu prüfen (Vergleich des ASCII- oder Unicode-Codes) und das einfach zu zählen - wenn hinterher alle drei Zähler größer als 2 sind, ist deine Bedingung erfüllt.

      und wenn man das geschickt anstellt, sollte es auch schneller sein als der reg. ausdruck.

      prost
      seth

      1. (hab's nicht getestet, bin aber der meinung, dass das so funzen sollte.)

        das tut es auch!
        danke! genau das was ich gesucht hab ^^

        mfg lindsey