Ce n'est pas un problème pour débutant car ce n'est pas spécialement simple à faire:
\b(?=\w{5}\b)(?=(\w*?(\w))\w+\2)(?!\1\w*(\w)\w*\3)(?!\w*(\w)\4)\w+
démo
Explication: si tu ne connais pas les groupes de capture (capture groups), les références aux groupes de capture (backreference), et les tests avant (lookahead) va d'abord voir le tutoriel de Guillaume Rossolini sur le site.
- \b(?=\w{5}\b) sélectionne une position dans la chaîne au début d'un mot de 5 caractères.
- (?=(\w*?(\w))\w+\2) fait deux choses: il trouve le premier caractère répété avec au moins un caractère de séparation (en utilisant le groupe 2 et sa référence) et capture dans le groupe 1 le début du mot jusqu'à ce caractère inclus (ce qui va être utile pour la suite).
- (?!\1\w*(\w)\w*\3) vérifie qu'il n'y a pas d'autre caractère répété avec un caractère de séparation au delà de celui qui a été trouvé précédemment, c'est pour celà que la sous pattern commence par une référence au groupe de capture 1.
- (?!\w*(\w)\4) vérifie qu'il n'y a pas de caractères répétés consécutifs.
- \w+ matche le mot.
À noter que je n'ai pas raccourci la pattern en \b(?=(\w*?(\w))\w+\2)(?!\1\w*(\w)\w*\3)(?!\w*(\w)\4)\w{5}\b pour pouvoir exclure rapidement tous les mots qui n'ont pas 5 caractères sans avoir à tester les conditions plus complexes.
Partager