2 votes

En utilisant regex pour déterminer une main droite (main non ordonnée)

Une suite au poker est constituée de cinq cartes consécutives, par exemple 23456 ou 89TJQ. Avec une main "triée", l'expression régulière pourrait être écrite comme suit :

^(A2345|23456|34567|45678|56789|6789T|789TJ|89TJQ|9TJQK|TJQKA)$

C'est un peu verbeux mais assez direct. Cependant, serait-il possible de générer une expression régulière (sensée) si la main n'était pas ordonnée ? Par exemple, si la main était 52634 ou JQ89T ??

Une façon possible serait d'utiliser un lookahead ?=.* (qui serait essentiellement "non trié"), par exemple :

^(?:
     (?=.*A)(?=.*2)(?=.*3)(?=.*4)(?=.*5)
    |(?=.*2)(?=.*3)(?=.*4)(?=.*5)(?=.*6)
    |(?=.*3)(?=.*4)(?=.*5)(?=.*6)(?=.*7)
    |(?=.*4)(?=.*5)(?=.*6)(?=.*7)(?=.*8)
    |(?=.*5)(?=.*6)(?=.*7)(?=.*8)(?=.*9)
    |(?=.*6)(?=.*7)(?=.*8)(?=.*9)(?=.*T)
    |(?=.*7)(?=.*8)(?=.*9)(?=.*T)(?=.*J)
    |(?=.*8)(?=.*9)(?=.*T)(?=.*J)(?=.*Q)
    |(?=.*9)(?=.*T)(?=.*J)(?=.*Q)(?=.*K)
    |(?=.*T)(?=.*J)(?=.*Q)(?=.*K)(?=.*A)
)
.{5}$

Y a-t-il d'autres / meilleures approches pour déterminer si une suite existe en utilisant uniquement des expressions régulières ?

5voto

ctwheels Points 13464

Vous pouvez utiliser l'expression régulière suivante :

Consultez l'expression régulière utilisée ici

(?!.*(.).*\1)(?:[A2345]{5}|[23456]{5}|[34567]{5}|[45678]{5}|[56789]{5}|[6789T]{5}|[789TJ]{5}|[89TJQ]{5}|[9TJQK]{5}|[TJQKA]{5})

Cette expression fonctionne en utilisant d'abord une vue en avant négative pour s'assurer que la chaîne ne contient pas de doublons (?!.*(.).*\1). Ensuite, elle cherche à faire correspondre 5 caractères parmi toutes les possibilités de suite.

 (?!.*(.).*\1)
#^^^         ^ vue en avant négative pour s'assurer que ce qui suit ne correspond pas
#   ^^         correspond à n'importe quel caractère un nombre quelconque de fois
#     ^^^      capture un caractère dans le groupe de capture #1
#        ^^    correspond à n'importe quel caractère un nombre quelconque de fois
#          ^^  correspond au même texte que celui qui a été le plus récemment capturé par le premier groupe de capture

Avec JQQ89, cela fonctionne comme suit : - .* correspond à J - (.) capture Q - .* ne correspond à rien - \1 tente de correspondre à Q (et réussit) - La vue en avant négative a une correspondance, donc la recherche échoue.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X