55 votes

Correspondance des chiffres avec les expressions régulières - uniquement des chiffres et des virgules

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?

41voto

ThiefMaster Points 135805

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 */
}

10voto

Gary Hole Points 9736

Essaye ça:

 ^-?\d{1,3}(,\d{3})*(\.\d\d)?$|^\.\d\d$
 

Permet:

 1
12
.99
12.34 
-18.34
12,345.67
999,999,999,999,999.99
 

7voto

zx81 Points 22309

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

  • Écrire une expression régulière pour rechercher un numéro dans une plage donnée est dur. Vous pouvez faire une erreur même d'écrire une regex pour correspondre à un nombre entre 1 et 10.
  • Une fois que vous avez une regex pour un certain nombre, il est difficile à déboguer. Tout d'abord, c'est affreux à regarder. Deuxièmement, comment pouvez-vous être sûr qu'il correspond à toutes les valeurs que vous voulez sans correspondant à chacune des valeurs que vous ne voulez pas? Franchement, si vous êtes par vous-même, sans les pairs à la recherche-dessus votre épaule, vous ne pouvez pas. Le meilleur de débogage technique est à la sortie de toute une gamme de numéros par programme et vérifier à l'encontre de la regex.
  • Heureusement, il existe des outils pour générer une regex pour un nombre automatiquement la plage.

C. Passer votre Regex de l'Énergie à bon escient: l'Utilisation des Outils

  • Nombres dans une plage donnée est un problème qui a été résolu. Il n'y a pas besoin pour vous d'essayer de réinventer la roue. C'est un problème qui peut être résolu de façon mécanique, par un programme, d'une manière qui est garanti être exempt de toute erreur. Profitez de cette balade gratuite.
  • La résolution d'un certain nombre de gamme de la regex peut être intéressant pour des fins d'apprentissage une couple de fois. Au-delà, si vous avez de l'énergie à investir dans la réalisation de vos regex compétences, de passer sur quelque chose d'utile, comme les approfondir votre compréhension de l'expression rationnelle de la cupidité, de la lecture sur Unicode regex, en jouant avec zéro-largeur de matchs ou de la récursivité, la lecture de la SORTE regex FAQ et découvrir des trucs comme la manière de les exclure de certains modèles, à partir d'une regex match... ou de la lecture des classiques tels que Matering Expressions Régulières, 3e Éd ou Les Expressions Régulières livre de cuisine, 2e Ed .

Pour les outils, vous pouvez utiliser:

  • En Ligne: Regex_for_range
  • En mode hors connexion: le seul que je connais est 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.
  • Si les conditions sont trop complexes, auto-générer des deux gammes... puis de se joindre à eux avec une alternance de l'opérateur |

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?

  • Laissez ancrage de l'expression entre ^ et $ pour éviter submatches
  • Laissons une option moins: -?
  • Nous allons correspondre à deux types de nombres de chaque côté d'une alternance (?:this|that):
  • Sur la gauche, un style Européen chiffres avec, en option, la virgule pour les décimales partie: [1-9][0-9]*(?:,[0-9]+)?
  • Sur la droite, un nombre avec des séparateurs de milliers: [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.

3voto

Essaye ça:

 ^-?[\d\,]+$
 

Cela autorisera optionnellement - comme premier caractère, puis toute combinaison de virgules et de chiffres.

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