IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Que signifie le signe égal dans une expression régulière? [RegExp]


Sujet :

JavaScript

  1. #1
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut Que signifie le signe égal dans une expression régulière?
    Bonjour,

    J'ai trouvé deux exemples de regex pour des mots de passe. Ces expressions contiennent le signe = qui semble avoir un rôle de syntaxe. Après une recherche dans la littérature et sur le Web, je n'ai rien trouvé (ou j'ai mal cherché!?)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	// Doit contenir des majuscules, des chiffres et des minuscules
    	strongRegex = new RegExp("^(?=.{8,})(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*\\W).*$", "g"),
    	// Doit contenir soit des majuscules et des minuscules soit des minuscules et des chiffres
    	mediumRegex = new RegExp("^(?=.{7,})(((?=.*[A-Z])(?=.*[a-z]))|((?=.*[A-Z])(?=.*[0-9]))|((?=.*[a-z])(?=.*[0-9]))).*$", "g"),

  2. #2
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    Voici un petit tuto qui m'a permis (il y a quelques années) de comprendre certaines choses sur les regexp. Il est dans mes favoris.

    http://www.lilhoot.eu/regex-et-preg-...les-chaines,a3

  3. #3
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 982
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 982
    Par défaut
    Le égal en lui même n'a pas de sens particulier, il représente le caractère = et n'a pas besoin d'être échappé pour être reconnu, mais il peut aussi faire partie de deux séquences particulières: le test avant ou lookahead (?=...) (la position est suivie de ...) et le test arrière ou lookbehind (?<=...) (la position est précédée de ...). L'intérêt de ces assertions est qu'elles permettent de tester une condition à partir de la position courante sans consommer de caractères. C'est pour cette raison que dans cet exemple on peut en empiler autant qu'on veut après ^ pour tester chacune sur toute la chaîne.

    À noter que pour les deux patterns, le flag g (qui impose de chercher toutes les occurrences dans la chaîne) est inutile puisqu'elles sont toutes les deux ancrées au début de la chaîne avec ^. Donc flag g ou pas, le seul endroit où ces patterns peuvent réussir c'est au début.

    On peut les améliorer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const strongRegex = /^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*\W).{8,}$/;
    const mediumRegex = /^(?:(?=.*[A-Z])(?=.*[a-z0-9])|(?=.*[a-z])(?=.*[0-9])).{7,}$/;

  4. #4
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut
    Merci. Dommage qu'il n'apparaît pas dans les moteurs de recherche. Je l'ai mis moi aussi en favori.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut
    Oh, là, là, ma tête!
    Après lecture du tuto indiqué par badaze et les explications données par CosmoKnacki, je comprends mieux mais pas tout. Je n'arrive pas à bien analyser chaque expression.
    Tout d'abord, je suppose que dans le deuxième exemple de CosmoKnacki le ':' est une erreur et qu'il faut lire '='.
    Dans l'exemple #1 du tuto, je ne vois pas à quoi correspondent les '\b'.
    Si je prends à partir du début du premier exemple de CosmoKnacki, je crois comprendre que:
    - le début de la chaîne, doit être suivi de n'importe quelle suite de caractères ( .* ) doit être suivie d'une majuscule,
    - toujours à partir du début de la chaîne, n'importe quelle suite de caractères doit aussi être suivie d'une minuscule,
    - etc.
    Par contre, je ne vois pas ce qui doit être répété 8 fois. Le caractère universel ou toute la chaîne.
    A partir de là, je ne vois pas comment indiquer à l'utilisateur la catégorie de caractères manquante.

  6. #6
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 982
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 982
    Par défaut
    Le : n'est pas une erreur, car je ne commets JAMAIS d'erreurs! la séquence (?:...) est un simple groupe (appelé groupe non-capturant) qui sert à ... grouper, par opposition au groupe capturant (...) qui groupe également mais en plus capture, or ici ce n'est pas nécessaire. Utilise regex101.com pour tester tes patterns, en plus il fournit une décomposition de celles-ci.

    Bien entendu, .{8,} signifie: 8 caractères ou plus (n'importe lesquels sauf le saut de ligne). Dans la pattern, ces caractères sont comptés depuis le début de la chaîne, car comme je l'ai dit précédemment, les lookahead ne consomment pas de caractères (autrement dit une fois leur parenthèse fermée, on est toujours à la même position qu'avant).

    A partir de là, je ne vois pas comment indiquer à l'utilisateur la catégorie de caractères manquante.
    C'est bien le problème avec ce genre d'approche (une pattern qui vérifie toutes les conditions), tu n'as aucun moyen d'indiquer à l'utilisateur quelle est l'erreur. Si tu veux faire ça, il faut tester chaque condition séparément.

    Autres solutions:
    • se contenter de donner toutes les conditions requises à l'utilisateur (il est assez grand pour se débrouiller tout seul).
    • ne pas lui imposer de conditions du tout. VIVA LA LIBERTÀ!

  7. #7
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut
    Merci pour tout. Je pense que je vais me débrouiller. En fait, je ne veux rien imposer à l'utilisateur mais lui donner une simple indication.

  8. #8
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 982
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 982
    Par défaut
    Tu peux éventuellement faire une pattern où tout est optionnel avec un groupe de capture par condition et vérifier ensuite les groupes qui sont vides:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    const pat = /^(?=(.*[A-Z])?)(?=(.*[a-z])?)(?=(.*[0-9])?)(?=(.*\W)?).{8,}$/;
     
    let m = machaine.match(pat);
     
     
    let valid = true,
        message = '';
     
    if ( !m[0] ) {
        message += "La chaîne est trop courte.\n";
        valid = false;
    }
     
    if ( !m[1] ) {
        message += "Il manque une majuscule.\n";
        valid = false;
    }
     
    if ( !m[2] ) {
        message += "Il manque une minuscule.\n";
        valid = false;
    }
    //...
    Mais est-ce que ça vaut mieux que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if ( machaine.length < 8 ) {
        message += "La chaîne est trop courte.\n";
        valid = false;
    }
     
    if ( !/[A-Z]/.test(machaine) ) {
        message += "Il manque une majuscule.\n";
        valid = false;
    }
    //...
    pas sûr.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Une date butoire dans une expression régulière
    Par zooffy dans le forum ASP.NET
    Réponses: 4
    Dernier message: 14/02/2008, 10h11
  2. Réponses: 5
    Dernier message: 31/08/2006, 13h34
  3. Parenthèses dans une expression régulière
    Par papyreno dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 10/05/2006, 16h28
  4. [EXP] Evaluation dans une expression régulière
    Par SergentHeinz dans le forum Langage
    Réponses: 7
    Dernier message: 10/11/2005, 18h17
  5. Réponses: 6
    Dernier message: 17/08/2005, 12h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo