Bonjour à tous et à toutes !
Je suis en train de réaliser un programme en C++ qui joue avec les nombres.
L'utilisateur entre une chaine de caractères et je dois vérifier le format avant de construire mon nombre sur la chaine qu'il m'a donnée.
La construction du nombre se fera après et sera grandement facilitée vue qu'on aura vérifié le format avant.
Pour l'instant, je vérifie le format à la main avec une fonction horrible qui joue avec les booléens, qui passent à vrai lorsqu'on est dans une condition et dans les autres conditions vérifie tel ou tel type de booléen, et renvoie faux dans le cas échéant. La fonction est affreuse et est fortement source aux bugs.
Pour info, je vous passe le code de la fonction:
Cliquez pour afficher
Comme vous le voyez, il y a des if dans tous les sens et je peux très bien avoir oublié une condition quelque part sans m'en rendre compte.
Maintenant, je vais vous dire ce que fait ce code et les "règles" de la regex:
Ma chaine doit être de la forme:
- des chiffres (genre "12535")
- un signe '+' ou '-' en début de chaine ("-12532" ou "+12523")
- un point '.' ou une virgule ',' au milieu de la chaine ou au début, mais pas à la fin ("12125.256" ou "1254,855" ou encore ".0225")
- à la place des chiffres, on peut avoir des lettres majuscules ("ABGFS256")
- on peut aussi avoir des chiffres entre crochets ("[15]16[21]102")
- on peut avoir des lettres et des chiffres entre crochets dans la même chaine ("A[10]B01[15]")
- la chaine peut contenir la lettre minuscule 'e', si il y a le 'e', un nombre doit suivre le 'e', un signe peut être renseigné ('+' ou '-') mais doit suivre le 'e' (genre: "10e-32" ou "10e+32" ou encore "10e32")
- comme dernier caractère on peut avoir une base parmi les 4 lettres (minuscule obligatoirement) suivantes: 'b', 'o', 'd' ou 'h' (genre "ABC01DEFh")
- la chaine peut être entièrement (le signe avec) entre parenthèses, et si parenthèses il y a, un nombre (pas de signe!) doit suivre la parenthèse fermante (genre: "(-11001A[19]10)23") et si parenthèses, interdiction d'avoir une base à fin ('b', 'o', 'd' ou 'h')
Cas particuliers: le NaN et le INF
- On peut avoir NaN ou INF dans la chaine
Si on a NaN ou INF, on ne peut pas avoir:
- de chiffres
- de point ou de virgule
- de lettres
- des chiffres entre crochets
- de 'e'
Mais on peut avoir:
- un signe (uniquement pour le INF)
- une base
- les parenthèses
Cette fonction ne vérifie que le format, elle ne vérifie pas (une autre fonction s'en charge) si les nombres/lettres/nombres entre crochets sont plus petits que la base renseignée (genre "(0124)3", le 3 derrière la parenthèse signifie "en base 3", il y a un '4' dans la chaine et la base 3 n'accepte que les 0, les 1 et les 2).
Voilà.
Pour info, j'ai essayé d'aller sur le site du zéro mais il est en dérangement, donc pas moyen d'étudier les regex pour transformer ce code en une superbe regex, la regex de l'année.
En vous remerciant d'avance,
Aenonis
-----