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 :

regexp test "au maximum x occurences " [RegExp]


Sujet :

JavaScript

  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 217
    Par défaut regexp test "au maximum x occurences "
    Bonjour les amis,

    j'ai fais un regexp pour tester la saisie d'un champ qui doit être de cette forme:
    être composé de 25 caractères au maximum dont :
    les caractères alphanumériques
    -au plus une fois la parenthèse ouvrante et une fois la parenthèse fermante,
    -au plus 2 fois le underscore (_),
    -au plus 3 fois le tiret du 6 (-)
    -le caractere espace au au plus 4fois
    edit : le caractere slach ( /) au plus 2fois
    voici le code
    Code javaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function VerifierChamp(value) {
    var exp=new RegExp("^[a-zA-Z0-9/{,2}{,2}({,1}){,1}_{,2} {,4}-{,3}]{,25}");
     if ( exp.test(value) ) {alert("Le value["+value+"] est valide :)"); }
          else {alert(" E R R E U R !\n\nLe value["+value+"] n'est pas valide !!!!"); }
     }

    La syntaxe marche jusqu'au niveau de la parenthèse qui suit le tiret du 6.
    Apres pour le reste la vérification marche juste pour les caractères alphanumériques mais ne respecte pas les valeurs par exemple quand j'écris papa((( il me dis que c'est bon
    je voudrais savoir si la façon dont je l'ai fais est bon d'abord et puis ce qui ne va pas.

    je débute avec les regexp donc pardonnez mes bêtises si j'en ai fais

    Merci de votre aide

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 658
    Billets dans le blog
    1
    Par défaut
    ne fonctionne pas comme au plus une fois dans une classe []
    et ce n'est d'ailleurs pas possible dans une regexp de vérifier si la chaine comporte au maximum 2 occurrences sauf à tester la longueur d'un match ..

    Il va falloir passer par des indexOf en boucle ...
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 128
    Par défaut
    Si c'est possible mais c'est un poil complexe et surtout un peu verbeux.
    Il faut utiliser des lookahead.

    L'expression fait un peu peur au premier abord mais elle n'est pas si compliquée que ça, c'est le même principe répété une douzaine de fois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var rx = /(?=(?:^[^()]*\([^()]*\)[^()]*$|^[^()]*$))(?=^[^_]*_?[^_]*_?[^_]*$)(?=^[^-]*-?[^-]*-?[^-]*-?[^-]*$)(?=^[^\s]*\s?[^\s]*\s?[^\s]*\s?[^\s]*\s?[^\s]*$)(?=^[^/]*\/?[^/]*\/?[^/]*$)^[a-zA-Z\d\s\-_/()]{1,25}$/;
     
    console.log(rx.test('1-   // --__(2)'));

  4. #4
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 658
    Billets dans le blog
    1
    Par défaut
    le souci des lookaround c'est qu'ils n'acceptent pas des longueurs non définies
    or dans son cas c'est plus de ... qui n'est pas gérable en regexp
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 128
    Par défaut
    Non Xeuch demande "au plus" ce qui veut dire "au maximum".

    Et puis même si cela peut sembler contre-intuitif il est parfaitement possible de gérér des minimums ou des maximums avec des lookaheads.

    En procédant de cette manière par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    var rxMaxTwoUnderscore = /(?=^[^_]*_?[^_]*_?[^_]*$).{3,6}/;
    var rxMinTwoUnderscore = /(?=_.*_).{3,6}/;
     
    console.log(rxMaxTwoUnderscore.test('az_er_t_y')); // false trop d'underscore
    console.log(rxMaxTwoUnderscore.test('az_ert_y'));  // true
    console.log(rxMaxTwoUnderscore.test('azert_y'));   // true
    console.log(rxMaxTwoUnderscore.test('azerty'));    // true
     
    console.log(rxMinTwoUnderscore.test('az_er_t_y')); // true
    console.log(rxMinTwoUnderscore.test('az_ert_y'));  // true
    console.log(rxMinTwoUnderscore.test('azert_y'));   // false pas assez d'underscores
    console.log(rxMinTwoUnderscore.test('azerty'));    // false pas assez d'underscores

  6. #6
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 658
    Billets dans le blog
    1
    Par défaut
    Je suis très surpris car dans ton look ahead tu as un * .... or j'ai toujours lu que les look around n'acceptaient pas de longueur indéterminée ...
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  7. #7
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 217
    Par défaut
    Merci beaucoup les amis,
    je vais essayer la methode avec les lookahead au final.
    Cependant je ne sais pas comment ajouter dans mon regex le caractère espace j'ai essayer avec un\s mais quand j'écris papa maman il me dit que ça ne marche pas.
    c'est pour sélectionner tous les caractères alphanumériques avec /, -, - et espace.
    voir le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var exp=new RegExp("^[a-zA-Z0-9_/\-\s]{1,25}$","g");

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 128
    Par défaut
    Derien,

    ton \s (classe espaces) ne marche pas car tu es dans une String, donc cela échappe ton s.

    Quand tu utilise le constructeur RegExp et que tu lui passe une String il faut bien que tu penses à doubler ton échappement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var exp=new RegExp("^[a-zA-Z0-9_/\\-\\s]{1,25}$","g");
    Mais le mieux c'est d'utiliser la notation littérale pour ne pas compliquer outre mesure ton expression :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var exp=/^[a-zA-Z0-9_/\-\s]{1,25}$/g;
    N'utilise le constructeur que si tu es obligé de le faire (expression avec des parties dynamiques) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var exp=new RegExp("^[a-zA-Z0-9_/\\-\\s]{1,"+maxLength+"}$","g");

  9. #9
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 217
    Par défaut
    Merci beaucoup theGwy,

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

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