JanSchedt: Was bedeutet diese Regex?

Hallo!

In einem alten Programmcode, den ich bearbeiten muss, finde ich folgenden Regex und kann mir diese nicht erklären.

[1]*(?=[A-Za-z0-9]{8,})(?=[A-Za-z0-9]*[0-9])(?=[A-Za-z0-9]*[a-z])(?=[A-Za-z0-9]*[A-Z])[A-Za-z0-9]*$

Nach meinem Verständnis hätte man das doch auf "[2]{8,}$" verkürzen können, oder übersehe ich etwas?

Vielen Dank für eure Hilfe.


  1. A-Za-z0-9 ↩︎

  2. A-Za-z0-9 ↩︎

  1. Hallo,

    In einem alten Programmcode, den ich bearbeiten muss, finde ich folgenden Regex und kann mir diese nicht erklären.

    [1]*(?=[A-Za-z0-9]{8,})(?=[A-Za-z0-9]*[0-9])(?=[A-Za-z0-9]*[a-z])(?=[A-Za-z0-9]*[A-Z])[A-Za-z0-9]*$

    • Stringanfang
    • Beliebig viele Wortzeichen (man könnte auch \w schreiben)
    • Lookahead: 8 oder mehr Wortzeichen gefolgt von einer Ziffer
    • Lookahead: Beliebig viele Wortzeichen gefolgt von einem Kleinbuchstaben
    • Lookahead: Beliebig viele Wortzeichen gefolgt von einem Großbuchstaben
    • Beliebig viele Wortzeichen
    • Stringende

    Nach meinem Verständnis hätte man das doch auf "[2]{8,}$" verkürzen können, oder übersehe ich etwas?

    Lass mich raten: Hier wird ein Passwort auf seine Stärke geprüft, und die Anforderungen waren:

    • Mindestens acht Zeichen,
    • mindestens ein Kleinbuchstabe,
    • mindestens ein Großbuchstabe,
    • mindestens eine Ziffer.

    Das drückt obige RegExp auch korrekt aus, soweit ich das sehe, wenn auch ziemlich umständlich.

    Ich würde hier

    • Auf die Länge prüfen >= 8 &&
    • Auf die RegExp [a-z] prüfen &&
    • Auf die RegExp [A-Z] prüfen &&
    • Auf die RegExp \d prüfen

    Besser wäre eine Bibliothek, die die Passwortstärke sinnvoll berechnet und die nicht nur ASCII zulässt, sondern auch ein »ä« als Kleinbuchstaben anerkennt.

    Mathias


    1. A-Za-z0-9 ↩︎

    2. A-Za-z0-9 ↩︎

    1. Hi,

      [1]*(?=[A-Za-z0-9]{8,})(?=[A-Za-z0-9]*[0-9])(?=[A-Za-z0-9]*[a-z])(?=[A-Za-z0-9]*[A-Z])[A-Za-z0-9]*$

      • Stringanfang
      • Beliebig viele Wortzeichen (man könnte auch \w schreiben)
      • Lookahead: 8 oder mehr Wortzeichen gefolgt von einer Ziffer

      da mischst Du 2 der vielen Lookaheads.
      der 1. Lookahead: mindestens 8 Wortzeichen
      der 2. Lookahead: beliebig viele Wortzeichen gefolgt von einer Ziffer

      • Lookahead: Beliebig viele Wortzeichen gefolgt von einem Kleinbuchstaben
      • Lookahead: Beliebig viele Wortzeichen gefolgt von einem Großbuchstaben
      • Beliebig viele Wortzeichen
      • Stringende

      Lass mich raten: Hier wird ein Passwort auf seine Stärke geprüft, und die Anforderungen waren:

      • Mindestens acht Zeichen,
      • mindestens ein Kleinbuchstabe,
      • mindestens ein Großbuchstabe,
      • mindestens eine Ziffer.

      Das drückt obige RegExp auch korrekt aus, soweit ich das sehe, wenn auch ziemlich umständlich.

      Ich würde hier

      • Auf die Länge prüfen >= 8 &&
      • Auf die RegExp [a-z] prüfen &&
      • Auf die RegExp [A-Z] prüfen &&
      • Auf die RegExp \d prüfen

      Manche Leute meinen halt, daß es sinnvoller ist, einen sehr komplizierten Ausdruck zu benutzen als mehrere einfache ...

      Besser wäre eine Bibliothek, die die Passwortstärke sinnvoll berechnet und die nicht nur ASCII zulässt, sondern auch ein »ä« als Kleinbuchstaben anerkennt.

      und auch Satzzeichen zuläßt.
      Damit man Merksätze zu Paßwörtern verwenden kann, z.B.
      Dieses war der 1. Streich, und der 2. folgt sogleich! ⇒ Paßwort: Dwd1S,ud2.fs!

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      O o ostern ...
      Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.

      1. A-Za-z0-9 ↩︎

      1. Hallo,

        da mischst Du 2 der vielen Lookaheads.

        Ja, die RegExp hat mich erfolgreich getrollt…

        … und auch Satzzeichen zuläßt.
        Damit man Merksätze zu Paßwörtern verwenden kann, z.B.
        Dieses war der 1. Streich, und der 2. folgt sogleich! ⇒ Paßwort: Dwd1S,ud2.fs!

        Da gefällt mir die Langversion viel besser. Passphrases sind sicherer und genauso schnell zu tippen. :)

        Mathias

      2. Hallo,

        z.B.
        Dieses war der 1. Streich, und der 2. folgt sogleich! ⇒ Paßwort: Dwd1S,ud2.fs!

        Access denied!
        Bitte prüfen Sie die Anzahl der Punkte...

        Gruß
        Kalk

        1. Hi,

          Dieses war der 1. Streich, und der 2. folgt sogleich! ⇒ Paßwort: Dwd1S,ud2.fs!

          Access denied!

          Access Granted!

          Bitte prüfen Sie die Anzahl der Punkte...

          Du vergißt, daß grundsätzlich der erste Punkt weggelassen werden muß!  ;-)

          cu,
          Andreas

          --
          Warum nennt sich Andreas hier MudGuard?
          O o ostern ...
          Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
          1. Hallo,

            Du vergißt, daß grundsätzlich der erste Punkt weggelassen werden muß!  ;-)

            Und bei einem Doppelpunkt, welcher ist da der erste und wie lasse ich ihn weg? ;-o

            Gruß
            Kalk

            1. Hi,

              Du vergißt, daß grundsätzlich der erste Punkt weggelassen werden muß!  ;-)
              Und bei einem Doppelpunkt, welcher ist da der erste und wie lasse ich ihn weg?

              Stell Dich doch nicht so an, ist doch ganz einfach:

              Bei Leserichtung von links nach rechts und (zeilenweise) oben nach unten den oberen Punkt weglassen, also "." statt ":" nehmen.

              Bei umgekehrter Leserichtung (zeilenweise unten nach oben) selbstverständlich den unteren weglassen. Und statt ":" dann "·" nehmen.

              cu,
              Andreas

              --
              Warum nennt sich Andreas hier MudGuard?
              O o ostern ...
              Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
          2. Hallo

            Dieses war der 1. Streich, und der 2. folgt sogleich! ⇒ Paßwort: Dwd1S,ud2.fs!

            Access denied!

            Access Granted!

            Bitte prüfen Sie die Anzahl der Punkte...

            Du vergißt, daß grundsätzlich der erste Punkt weggelassen werden muß!  ;-)

            Aber nur am 12. und 27. des Monats und nur, wenn diese Tage auf einen Montag oder einen Samstag fallen und nur, wenn diese Tage auf abnehmenden Halbmond treffen. :-)

            Tschö, Auge

            --
            Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
            Terry Pratchett, "Wachen! Wachen!"
            ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
            Veranstaltungsdatenbank Vdb 0.3
  2. Hallo Jan!

    [1]*(?=[A-Za-z0-9]{8,})(?=[A-Za-z0-9]*[0-9])(?=[A-Za-z0-9]*[a-z])(?=[A-Za-z0-9]*[A-Z])[A-Za-z0-9]*$

    Nach meinem Verständnis hätte man das doch auf "[2]{8,}$" verkürzen können, oder übersehe ich etwas?

    Nach meinem auch. Und am Start ^ die lookaheads jeweils 1x ausführen können:

    ^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])[A-Za-z0-9]{8,}$  
    #     | muss eine Ziffer enthalten  
    #                | muss einen Kleinbuchstaben enthalten  
    #                           | muss einen Großbuchstaben enthalten  
    #                                 | darf nur aus [A-Za-z0-9] bestehen (mindestens 8)  
    
    

    Duch die Verwendung von shorthands könnte man die Länge des Suchmusters noch weiter reduzieren:

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

    lG, Jonny 5


    1. A-Za-z0-9 ↩︎

    2. A-Za-z0-9 ↩︎