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

VB.NET Discussion :

Code regex remplissant quatre conditions [Débutant]


Sujet :

VB.NET

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2012
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Code regex remplissant quatre conditions
    Bonjour,
    je veux un code regex (pour VB.Net) remplissant les conditions suivantes en même temps:
    1- Le texte doit se composer d'au moins un mot et d'au plus six;
    2- Chaque mot doit se composer d'au moins deux caractères alphabétiques minuscules
    3- dans les mots composés de deux caractères je veux que ces caractères ne soient pas les mêmes (par exemple: "aa" est refusé)
    4- Dans les mots composés de plus de deux caractères un caractère ne doit pas se répéter successivement plus de deux fois (par exemple: "abbb" est refusé mais "babb" est accepté)

    Voici le code que j'ai entre les mains et qui fonctionne bien mais que je n'arrive pas à combiner pour satisfaire aux quatre conditions ci-dessus pour le même texte:

    Pour satisfaire aux conditions 1 et 2, voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ^(([a-z]+[a-z])(\s[a-z]+[a-z])?(\s[a-z]+[a-z])?(\s[a-z]+[a-z])?(\s[a-z]+[a-z])?(\s[a-z]+[a-z])?)$
    Pour satisfaire à la condition 3 voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ^(?!([a-z])\1)[a-z][a-z]$
    Pour satisfaire à la condition 4 voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ^(?=[a-z]{3,})(?:([a-z])(?!\1{2}))+$
    Mais je ne sais pas comment faire pour les combiner, svp aidez moi, ca fait des semaines que je travaille sur cela sans résultat.
    Merci infiniment

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    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 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Il me semble difficile de mettre tes patterns ensemble étant donné qu'elles sont toutes ancrées aux limites de la chaîne ce qui est un problème pour celles qui décrivent les mots.

    Il faut commencer par créer des patterns capables de trouver les mots dans une chaîne. Pour pouvoir se passer de l'aide des limites de la chaîne, on utilise les "limites de mots" (word boundaries) \b:

    Ces deux patterns jointes ensemble donnent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # Attention à la numérotation des groupes
    \b([a-z])[a-z]\b(?<!\1)|\b[a-z]{3,}\b(?<!\2\2([a-z])[a-z]*?)
    Ce qui peut se factoriser de cette manière en mettant en commun les deux premières lettres:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    \b ([a-z]) [a-z]
    (?>
        [a-z]+ \b
        (?<! \2 \2 ([a-z]) [a-z]*?)
      |
        \b (?<!\1)
    )
    Il ne reste plus qu'à remplir la condition n°1 en décrivant une phrase complète:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    \A                         # ancre de début de chaîne
    (?>                        # on encadre le tout dans un groupe atomique pour éviter un backtracking inutile en cas d'échec
        (?>                    # un espace (sauf en début de chaîne) suivi d'un mot 
            \s? ([a-z]) [a-z]  # le word boundary au début n'est alors plus nécessaire, et l'espace entre les mots est assuré par les word boundaries finaux
            (?>
                [a-z]+ \b
                (?<! \2 \2 ([a-z]) [a-z]*?)
              |
                \b (?<!\1)
            )
        ){1,6}
    )
    \z                        # ancre de fin de chaîne
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2012
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par CosmoKnacki Voir le message
    Il me semble difficile de mettre tes patterns ensemble étant donné qu'elles sont toutes ancrées aux limites de la chaîne ce qui est un problème pour celles qui décrivent les mots.

    Il faut commencer par créer des patterns capables de trouver les mots dans une chaîne. Pour pouvoir se passer de l'aide des limites de la chaîne, on utilise les "limites de mots" (word boundaries) \b:

    Ces deux patterns jointes ensemble donnent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # Attention à la numérotation des groupes
    \b([a-z])[a-z]\b(?<!\1)|\b[a-z]{3,}\b(?<!\2\2([a-z])[a-z]*?)
    Ce qui peut se factoriser de cette manière en mettant en commun les deux premières lettres:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    \b ([a-z]) [a-z]
    (?>
        [a-z]+ \b
        (?<! \2 \2 ([a-z]) [a-z]*?)
      |
        \b (?<!\1)
    )
    Il ne reste plus qu'à remplir la condition n°1 en décrivant une phrase complète:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    \A                         # ancre de début de chaîne
    (?>                        # on encadre le tout dans un groupe atomique pour éviter un backtracking inutile en cas d'échec
        (?>                    # un espace (sauf en début de chaîne) suivi d'un mot 
            \s? ([a-z]) [a-z]  # le word boundary au début n'est alors plus nécessaire, et l'espace entre les mots est assuré par les word boundaries finaux
            (?>
                [a-z]+ \b
                (?<! \2 \2 ([a-z]) [a-z]*?)
              |
                \b (?<!\1)
            )
        ){1,6}
    )
    \z                        # ancre de fin de chaîne
    Merveilleux. C'est ce que je voulais exactement. T'es un génie. Merci mille fois

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

Discussions similaires

  1. [AC-2007] Y-at'il un meilleur code pour tester plusieurs conditions ?
    Par tibofo dans le forum VBA Access
    Réponses: 6
    Dernier message: 13/07/2010, 15h21
  2. Comment mettre du code php dans une condition javascript ?
    Par Alexandrebox dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 05/04/2010, 12h55
  3. [AC-2000] Code pour pour multi-conditions If Then
    Par tibogaet dans le forum VBA Access
    Réponses: 12
    Dernier message: 13/08/2009, 11h40
  4. [PostBack] code du PageLoad sous condition
    Par TheBlackReverand dans le forum ASP.NET
    Réponses: 2
    Dernier message: 17/02/2009, 15h14
  5. [Code] LA date comme condition
    Par skreu dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 25/11/2005, 09h14

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