Je n'arrive pas à comprendre comment construire un regex pour les valeurs d'exemple:
123,456,789
-12,34
1234
-8
Pourriez-vous m'aider?
Je n'arrive pas à comprendre comment construire un regex pour les valeurs d'exemple:
123,456,789
-12,34
1234
-8
Pourriez-vous m'aider?
Si vous ne voulez autoriser les chiffres et les virgules, ^[-,0-9]+$
est votre regex. Si vous aussi vous voulez autoriser des espaces, utilisez ^[-,0-9 ]+$
.
Toutefois, si vous souhaitez afin de permettre un bon nombre, vaut mieux aller avec quelque chose comme ceci:
^([-+] ?)?[0-9]+(,[0-9]+)?$
ou tout simplement utiliser .net de l'analyseur de numéro (pour les différents NumberStyles, consultez MSDN):
try {
double.Parse(yourString, NumberStyle.Number);
}
catch(FormatException ex) {
/* Number is not in an accepted format */
}
Depuis que cette question a été rouvert quatre ans plus tard, je tiens à offrir une différente. Comme quelqu'un qui passe beaucoup de temps à travailler avec les regex, de mon point de vue est ceci:
A. Si Possible, évitez d'Utiliser des Regex Pour Valider les Numéros de
Si possible, utilisez votre langue. Il peut y avoir des fonctions pour vous aider à déterminer si la valeur contenue par une chaîne est un nombre valide. Cela étant dit, si vous êtes d'accepter une variété de formats (les virgules, etc.) vous n'avez probablement pas le choix.
B. Ne pas Écrire l'expression régulière Manuellement pour Valider un Numéro de Plage
C. Passer votre Regex de l'Énergie à bon escient: l'Utilisation des Outils
Pour les outils, vous pouvez utiliser:
RegexMagic
(pas libre) par regex gourou Jan Goyvaerts. C'est sa débutant regex produit, et que je me souviens qu'il a une grande gamme d'options pour générer des nombres dans une plage donnée, entre autres caractéristiques. |
D. Un Exercice: construire une Regex pour les Specs dans la Question
Ces spécifications sont assez large... mais pas nécessairement vague. Regardons l'exemple de valeurs:
123,456,789
-12,34
1234
-8
Comment faire les deux premières valeurs se rapportent? Dans la première, la virgule correspond à des groupes de puissances de trois. Dans la seconde, il est probablement correspond à la virgule décimale dans un continental de style Européen de format de nombre. Cela ne signifie pas que nous devrions permettre à des chiffres partout, comme en 1,2,3,44
. De même, nous ne devrions pas être restrictive. La regex dans la accepté de répondre, par exemple, ne peut pas correspondre à l'une des exigences, 123,456,789
(voir la démo).
Comment construisons-nous notre regex pour faire correspondre les specs?
^
et $
pour éviter submatches-?
(?:this|that)
:[1-9][0-9]*(?:,[0-9]+)?
[1-9][0-9]{1,2}(?:,[0-9]{3})+
Le complet regex:
^-?(?:[1-9][0-9]*(?:,[0-9]+)?|[1-9][0-9]{1,2}(?:,[0-9]{3})+)$
Voir la démo.
Cette expression ne permet pas de style Européen de numéros commençant par 0
, comme 0,12
. C'est une fonction, pas un bug. Pour correspondre à ceux aussi bien, un petit tweak va faire:
^-?(?:(?:0|[1-9][0-9]*)(?:,[0-9]+)?|[1-9][0-9]{1,2}(?:,[0-9]{3})+)$
Voir la démo.
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.