Bonjour,
Alors, juste pour le fun j'ai cherché à résoudre ça en regex et je suis parvenu je me suis grandement inspiré (euphémisme
) de ceci, ce qui donne lieu à deux solutions.
Enfin j'ai pas trop poussé les tests donc je garantis pas l'efficacité sur tous les cas
et de toute façon :
- c'est dur à déchiffrer (enfin encore plus qu'une regex "classique"
) - question perf c'est (en moyenne) pas trop ça
mais bon je les mets quand même ![:D](https://www.developpez.net/forums/images/smilies/icon_biggrin.gif)
1 2
| "^(?:([A-Z])(?=(?:(?!\1)[A-Z])*$)[A-Z]*?){#}"
"^(?>([A-Z])(?:(?<=\1[A-Z]+))|(?<distinct>[A-Z]))+$(?<-distinct>){#}" |
Note: dans les deux cas # est à remplacer par la longueur de la chaîne à tester.
Après la version Linq est quand même plus concise, lisible et efficace, même si j'aurais eu instinctivement tendance à l'écrire comme ceci :
s.All(AddressOf Char.IsLetter) AndAlso s.Distinct.Count = s.Length
Afin de pouvoir court-circuiter le test au premier caractère non valide (mais je chipote là
)
Cordialement !
Partager