2009-08-31 7 views
5

J'essaye de valider l'entrée d'utilisateur, qui est juste des nombres séparés par des virgules. Je voudrais le faire avec RegEx, mais je ne peux pas trouver la bonne expression.Regex pour le nombre séparé par des virgules

Il doit valider les chaînes suivantes (et plus):

1 
12 
123 
1,234 
12,345 
123,456 

et invalider les chaînes suivantes (et plus fou):

1,1 
1,12 
12,1 
12,12 
123,1 
123,1 

Toute aide serait grandement appréciée.

Voici ce que j'ai essayé jusqu'à présent (EDIT: qui ne fonctionne pas), ainsi que plusieurs variantes ->

^(((\d{1,3},)*\d{3})|(\d{1,3}))$ 
^(\d{1,3}[,])*\d{3}|\d{1,3}$ 

Répondre

14

Que diriez-vous ceci:

^\d{1,3}([,]\d{3})*$ 

Fondamentalement, vous pouvez avoir 1-3 chiffres sans virgule. Après cela, vous avez besoin d'une virgule. Si vous avez une virgule, le doit suivi de 3 chiffres de plus. Cette séquence de virgule à 3 chiffres peut apparaître n'importe quel nombre de fois.

EDIT: Comme Andrew Hare observé, vous ne se soucient pas de ce qui a été trouvé à l'intérieur des parenthèses au-delà du fait qu'il correspond, vous pouvez utiliser un groupe non-capture au lieu en plaçant ?: après la parenthèse d'ouverture:

^\d{1,3}(?:[,]\d{3})*$ 
+3

+1 Bien fait. Ma seule critique: puisque cette expression régulière est pour la validation seulement, vous devriez changer ce groupe de capture pour qu'il soit un groupe sans capture. –

+2

Bon point, mais ça m'a toujours dérangé que faire un groupe non-capture rend l'expression rationnelle plus laide. –

+0

en regardant la regex originale, il semble allumé une chaîne comme 12,1123 est légal ((\ d {1,3},) * \ d {3}) ce qui précède ne satisfait pas –

Questions connexes