Page 1 sur 1
[R] Conditions dans un WHILE
Posté : sam. 15 août 2015 23:30
par Yle
Bonsoir à tous,
J'ai un souci avec un test que j'aimerai faire dans un While
Tout d'abord mes qq lignes de code
► Afficher le texte
$Choix = ""
While (StringLen($Choix) < 1 Or StringLen($Choix) > 4)
$Choix = InputBox("Test", "Vous pouvez entrer de 1 à 4 caractères parmi ceux ci: N E S et O)" & @CRLF & _
"peu importe l'ordre. Exemple : SN ou NSE etc..." & @CRLF & _
"Si vous cliquez sur OK, les 4 lettres par défaut seront prises en compte", "NOSE", " ",400,180)
WEnd
MsgBox(0,"",$Choix)
Exit
Puis-je avec l'aide d'un
STRINGREGEXP dans mon while tester que l'on m'a bien rentré les lettres désirées : NSE et O ?
Sinon je vais être obligé de tester x combinaisons sur 4 caractères : NOSE, NSEO, NOES, NEOS etc...
Puis sur 3 caractères etc...
Si qq a une idée, d'avance merci.
Re: [..] Conditions dans un WHILE
Posté : dim. 16 août 2015 11:47
par mikell
Il faut vérifier qu'on a bien rentré les lettres désirées mais aussi qu'elles ne sont pas en double NNSE par exemple
Je te propose ça
Code : Tout sélectionner
StringRegExp($Choix, '([NSOE](?!.*\1)){' & StringLen($Choix) & '}')
Le regex vérifie que des lettres NSEO ne sont pas en double et que leur nombre correspond à la longueur de la string
Rajouter (?i) au début du pattern si tu le veux case insensitif
Re: [..] Conditions dans un WHILE
Posté : dim. 16 août 2015 12:50
par jguinch
@mikell : pas mal celle là

J'aime bien l'utilisation du \1 à l'intérieur du groupe lui-même
J'ajouterais juste ^ et $ et un nombre d’occurrences minimum (entre les accolades) :
Code : Tout sélectionner
StringRegExp($Choix, '^([NSOE](?!.*\1)){1,' & StringLen($Choix) & '}$')
Re: [..] Conditions dans un WHILE
Posté : dim. 16 août 2015 13:35
par mikell
Les ancres ne sont pas utiles vu qu'aucun autre caractère que ces 4-là n'est autorisé
Sinon pour les quantités min=1 et max=4 ya qu'à construire l'inputbox comme ça
Code : Tout sélectionner
Local $sValue = InputBox("Testing", "Entrez de 1 à 4 charactères", "", " M4")
MsgBox(0, "", $sValue)
Re: [..] Conditions dans un WHILE
Posté : dim. 16 août 2015 14:22
par jchd
Euh, quelqu'un a essayé de saisir EE ou NNNN par exemple ?
Re: [..] Conditions dans un WHILE
Posté : dim. 16 août 2015 16:59
par Yle
J'ai modifié ma ligne comme ceci :
While (StringLen($Choix) < 1 Or StringLen($Choix) > 4 Or StringRegExp($Choix, '([NSOE](?!.*\1)){' & StringLen($Choix) & '}') = 0)
Donc si j'entre :
N seul, résultat : N ok
NN : il accepte résultat : NN (ca ne me gêne pas)
NNN : il n'accepte pas -Tant mieux
NNNN : il n'accepte pas -Tant mieux
A ou AA ou AAA ou AAAA : il n'accepte pas -Normal
1 ou 2 ou 3 ou 4 lettres de NOSE : il accepte - c'est ok
Une question (subsidiaire) : Pourquoi accepte-il NN ?
Re: [..] Conditions dans un WHILE
Posté : dim. 16 août 2015 18:04
par mikell
Parce que comme jc l'a relevé j'ai fait une connerie de parenthèses
Code : Tout sélectionner
Local $Choix
While StringLen($Choix) < 1 or not StringRegExp($Choix, '(([NSOE])(?!.*\2)){' & StringLen($Choix) & '}' )
$Choix = InputBox("Testing", "Entrez de 1 à 4 charactères", "", " M4")
If @error Then Exit
Wend
msgbox(0,"", "ok")
et jguinch l'a même pô vu, roooh
...Il a dû avoir le même genre de soirée que moi hier soir

Re: [..] Conditions dans un WHILE
Posté : dim. 16 août 2015 18:23
par orax
Pas sûr que les StringLen soient bien nécessaires par contre.
Code : Tout sélectionner
While not StringRegExp($Choix, '^(?:([NSEO])(?!.*\1)){1,4}$')
Re: [..] Conditions dans un WHILE
Posté : dim. 16 août 2015 18:41
par jguinch
@mikell : j'avais vu qu'il y avait un truc par rapport au \1 qui était utiliser dans le premier groupe capturant, mais c'est vrai que j'ai pas testé plus que ça.
Perso, j'aurais fait exactement ce qu'à fait Orax

Re: [..] Conditions dans un WHILE
Posté : dim. 16 août 2015 18:46
par mikell
...et qui ne fonctionne pas avec par exemple NOEE <= sottise... je m'en vais aller cuver un brin (demain est un autre jour)
Re: [..] Conditions dans un WHILE
Posté : dim. 16 août 2015 18:50
par jguinch
► Afficher le texte
Code : Tout sélectionner
Local $Choix
While not StringRegExp($Choix, '^(?:([NSEO])(?!.*\1)){1,4}$')
$Choix = InputBox("Testing", "Entrez de 1 à 4 charactères", "", " M4")
If @error Then Exit
Wend
Euh, ça marche bien là, non ?

Re: [..] Conditions dans un WHILE
Posté : dim. 16 août 2015 19:43
par jchd
Il y en a même un poil de trop et d'un autre côté While n'est pas ici la construction la plus naturelle :
Code : Tout sélectionner
Local $Choix
Do
$Choix = StringUpper(InputBox("Testing", "Entrez de 1 à 4 charactères", "", " M4"))
If @error Then Exit
Until StringRegExp($Choix, '^(?:([NSEO])(?!.*\1))+$')
MsgBox(0,"",$Choix)
Re: [..] Conditions dans un WHILE
Posté : dim. 16 août 2015 21:34
par jguinch
Ah oui, le quantificateur fait doublon avec le M4 de l'inputbox (d'ailleurs, j'avais jamais fait gaffe à ce paramètre, c'est sympa).
Dans la doc de l'inputbox, je ne comprends pas trop la remarque If your script is going to use an inputbox you must include the pragma directive "#pragma compile(inputboxres, true)"
Ca laisse supposer qu'il fait forcément utiliser cette directive si on utilise un InpuBox ?
Re: [..] Conditions dans un WHILE
Posté : dim. 16 août 2015 21:40
par jchd
Je suis dans le même cas, je reste perplexe.
Re: [..] Conditions dans un WHILE
Posté : lun. 17 août 2015 09:04
par Yle
Bonjour à tous,
Cette solution me semble parfaite. Je passe en résolu.
Merci aux modérateurs d'avoir œuvré sur ce problème malgré un weekend difficile pour certains.
Re: [R] Conditions dans un WHILE
Posté : lun. 17 août 2015 09:36
par jchd
J'ai l'impression que c'est plutôt la semaine qui risque de poser problème. Très facile de se murger à donf, mais c'est à la réouverture des yeux que ça coince grave généralement.
Re: [R] Conditions dans un WHILE
Posté : lun. 17 août 2015 11:21
par mikell
Tant que les conséquences immédiates se résument à un problème style 'équipe de France de fotbal' (on a encore les bonnes idées de départ mais on merdoie la finition) ça veut dire que les connexions synaptiques demeurent fonctionnelles - bien qu'erratiques - et en général 48h après c'est OK

Re: [R] Conditions dans un WHILE
Posté : lun. 17 août 2015 12:32
par jchd
Tu me rassures ! Note que ça aurait été original : on voit partout des chats dans des bouteilles, mais pas pleines d'eau de vie.
Re: [R] Conditions dans un WHILE
Posté : lun. 17 août 2015 14:32
par mikell
Re: [R] Conditions dans un WHILE
Posté : lun. 17 août 2015 14:35
par jchd
Même tenir un verre peut s'avérer déli...cat
