Menu

Regex

lucky - 16 juil. 2017 à 17:48 - Dernière réponse :  lucky
- 17 juil. 2017 à 17:33
Bonjour,

Je suis en train de développer une sorte de jeu.

J'ai besoin d'imposer la saisie d'un mot avec les contraintes suivantes:

- le mot doit contenir 5 caractères (ni plus, ni moins)
- ce mot doit contenir 2 lettres identiques (et pas plus) et idéalement qui ne se suivent pas (ex.: neige)
- toutes les autres lettres doivent être différentes

Ex.: "neige" qui contient 5 caractères, 2 fois la lettre « e » et les autres lettres sont différentes

Merci d'avance pour vos lumières ! :)
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
yg_be 5804 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 21 juin 2018 Dernière intervention - 16 juil. 2017 à 18:13
1
Merci
bonjour, moi je ferais une petite fonction en php, qui ferait ceci:
- vérifier que la longueur est 5
- classer les lettres par ordre alphabétique
- compte le nombre de fois que deux lettres qui se suivent sont identiques
- vérifier que le nombre calculé est 1

Merci yg_be 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

CCM a aidé 24297 internautes ce mois-ci

Commenter la réponse de yg_be
Whismeril 11629 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 juin 2018 Dernière intervention - 16 juil. 2017 à 19:06
0
Merci
Bonjour en 2 fois c'est assez facile.

Le test sur la longueur, comme le propose yg_be, n'arrêtera pas des chiffres ou des caractère spéciaux, or quand je lis "mot" j'interprète "lettres", même si plus bas tu écris "caractères". Donc je propose comme 1ere regex
\b[A-Z]{5}\b
qui va chercher des mots de 5 lettres dans un texte ou
$[A-Z]{5}$
qui n'acceptera que des entrées complètes de 5 lettres, dans les 2 cas tu peux cocher l'option IgnoreCase.
Exemple 1
Exemple 2

La 2eme Regex
(?<=[^\1]*)(.)(?=[^\1]+\1[^\1]*)
va extraire les caractères en double séparées d'au moins un caractère différent. S'il y a plusieurs captures comme dans cet exemple alors ton mot n'est pas bon.



Merci !

Effectivement ma recherche ne s'effectue que sur des lettres (a-z).

Comme la recherche va se faire sur une liste de plusieurs milliers de mots en base de données, il n'y aurait pas la possibilité de définire un critère de recherche qui afficherait directement tous les mots qui répondent à mes critères ?

(Désolé je suis vraiment pas doué en regex...)
Whismeril 11629 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 juin 2018 Dernière intervention - 17 juil. 2017 à 17:12
Comme tu le vois la 2eme regex est déjà un peu compliquée, on se sert d'une capture relative pour vérifier s'il existe 2 lettres en double et si ces 2 lettres ne sont pas consécutives. Et s'il y en a 2 ça matche aussi....

Le tout en un, j'ai cherché un petit moment et je n'ai pas trouvé, c'est peut être possible cela dit.

Si tu cherches en bases de données, tu peux peut être faire une requête qui sort tous les mots de 5 lettres, puis une requête sur le résultat de la précédente avec la 2eme regex (je ne connais pas PHP, mais ça se fait très bien dans d'autres langages).

Ou même si tu es certain, qu'il n'y a que des mots dans la base de données, faire directement une requête avec la 2eme Regex.
Effectivement, avec 2 requêtes ça peut le faire.

Merci en tout cas pour le temps que tu as passé là dessus (c'est pas rien !)
Commenter la réponse de Whismeril