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

Java Discussion :

[Regex] Matcher la répétition de caractères


Sujet :

Java

  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2003
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 108
    Par défaut [Regex] Matcher la répétition de caractères


    Je suis pas sûr d'être au bon endroit, mais y'avait pas de section expression régulière. Et comme je le fais en Java.

    Voilà mon problème : je veux matcher la présence de caractères répetés au moins 3 fois de suite (aaa, BBB, 111... mais pas a123aa12a, ni aAaAa...).

    J'ai essayé ce pattern :
    (.)(\1{3,})
    et quelques dérivés :
    .{3,}
    (.){3,}

    Mais aucun ne semble fonctionner. Ce pattern est inclus dans une négation pour mon utilisation :
    (?!(.)(\1{3,}))

    Des idées ?

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Shuret Voir le message
    J'ai essayé ce pattern :
    (.)(\1{3,})
    Tu y était presque avec ce pattern, à deux détails près :
    • Le \ est interprété au niveau du compilateur, et \1 correspond au code du caractère avec la valeur unicode 1 (bref un caractère de contrôle), ce qui te fait tout foirer.
      Il faut le doubler !
    • Comme le point est pris en compte, il faut spécifier à partir de 2 caractères au lieu de trois (en clair : un caractères suivis d'au moins 2 caractères identiques).


    Au final cela donnerait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Pattern pattern = Pattern.compile("(.)\\1{2,}");
    a++

  3. #3
    Membre confirmé
    Inscrit en
    Septembre 2003
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 108
    Par défaut
    Merci pour ta réponse rapide et détaillée, mais ça ne marche pas :

    Voici le code :

    public static boolean validateSequence (String value) {
    String pattern = "(?!(.)\\1{2,})";
    return (value.matches(pattern));
    }
    Et les tests :
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    @Test
    public void testSequence1() {
    	password = "123456789azertyuiop";
    	Assert.assertTrue(RegExp.validateSequence(password));
    }
     
    @Test
    public void testSequence2() {
    	password = "abcccde";
    	Assert.assertFalse(RegExp.validateSequence(password));
    }
     
    @Test
    public void testSequence3() {
    	password = "abccdcec";
    	Assert.assertTrue(RegExp.validateSequence(password));
    }
     
    @Test
    public void testSequence4() {
    	password = "aBbBbbB";
    	Assert.assertTrue(RegExp.validateSequence(password));
    }
     
    @Test
    public void testSequence5() {
    	password = "aBBBcc123";
    	Assert.assertFalse(RegExp.validateSequence(password));
    }
     
    @Test
    public void testSequence6() {
    	password = "123334abfgd";
    	Assert.assertFalse(RegExp.validateSequence(password));
    }
     
    @Test
    public void testSequence7() {
    	password = "123444sjbbbcc";
    	Assert.assertFalse(RegExp.validateSequence(password));
    }
    Les tests 1, 3 et 4 ne fonctionnent pas, alors que le mot de passe devrait être validé. Comment ce-fait-ce donc ?

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Ta négation se fait normalement par rapport à un élément de base. Or il n'y en as aucun ici...


    De plus si je comprend bien tu veux vérifier qu'il n'y ai pas trois caractères identiques qui se suivent.

    matches() n'est pas la bonne solution car cela va vérifier que la totalité de la chaine correspondent bien au pattern.

    Il est plus judicieux de rechercher la présence de ces 3 caractères :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	public static boolean validateSequence(String value) {
    		return !Pattern.compile("(.)\\1{2,}").matcher(value).find();
    	}
    a++

  5. #5
    Membre confirmé
    Inscrit en
    Septembre 2003
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 108
    Par défaut
    Oui mais en fait ce pattern fait partie d'une validation du mot de passe plus complexe qui fonctionne pour le moment : au moins 1 lettre minuscule, au moins 1 lettre majuscule et au moins 1 chiffre, le tout sur 8 caractères. Je pensais détecter les bons pattern (ça donne (?=*.[a-z]) (?=.9[A-Z]) un truc dans le genre, j'ai pas le code chez moi) et de faire une négation sur les mauvais (d'où le (?!)). Est-il possible de faire ça en une seule fois ou faut-il que je sépare les 2 matchs ?

    Que veux-tu dire par "élément de base" ?

Discussions similaires

  1. [RegEx] [REGEXP] - Matcher la répétition de caractères
    Par cadoudal56 dans le forum Langage
    Réponses: 1
    Dernier message: 19/03/2011, 16h05
  2. Probleme regex Matcher
    Par Samildanach dans le forum Langage
    Réponses: 1
    Dernier message: 07/11/2008, 13h34
  3. [RegEx] regex pour trouver une phrase - caractère espace
    Par L0007 dans le forum Langage
    Réponses: 2
    Dernier message: 05/06/2008, 17h01
  4. Réponses: 12
    Dernier message: 04/09/2006, 17h59
  5. [jakarta][regex]Matcher mot en entier.
    Par thibaut dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 26/05/2004, 13h33

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