2010-05-21 7 views
3

Quelle est la meilleure expression régulière pour un entier séparé par une virgule? Il peut également contenir de l'espace entre les virgules, et le champ n'est pas requis, ce qui signifie qu'il peut être vide.Entier séparé par une virgule

123,98549 
43446 

etc ..

+2

Obligatoire Citation JWZ "Certaines personnes, lorsqu'elles sont confrontées à un problème, pensent 'je sais, j'utiliserai des expressions régulières'. Maintenant, ils ont deux problèmes." –

+0

Etes-vous sûr que c'est un coMa? – microspino

+0

@Microspino: le coma est ce que les gens essaient de faire fonctionner l'expression rationnelle. –

Répondre

7

C'est un très basique qui pourrait vous convenir:

/^[\d\s,]*$/ 

Il égalerons une chaîne aussi longtemps qu'il ne contient que des chiffres, des espaces et des virgules. Cela signifie que "123 456" passera, mais je ne sais pas si c'est un problème.

/^\s*(\d+(\s*,\s*\d+)*)?\s*$/ 

Celui-ci a ces résultats:

""    true 
"123"    true 
"123, 456"  true 
"123,456 , 789" true 
"123 456"   false 
" "    true 
" 123 "  true 
", 123 ,"   false 

Explication:

/^\s*(\d+(\s*,\s*\d+)*)?\s*$/ 
1 2 3 4 5 6 7 8 9 a b c d 

1.^ Matches the start of the string 
2. \s Matches a space * means any number of the previous thing 
3. ( Opens a group 
4. \d Matches a number. + means one or more of the previous thing 
5. ( Another group 
6. \s* 0 or more spaces 
7. , A comma 
8. \s* 0 or more spaces 
9. \d+ 1 or more numbers 
a. * 0 or more of the previous thing. In this case, the group starting with #5 
b. ? Means 0 or 1 of the previous thing. This one is the group at #3 
c. \s* 0 or more spaces 
d. $ Matches the end of the string 
+0

Très beau jeu de résultats. Quel outil utilisez-vous pour les obtenir? Merci! – eKek0

+0

@ eKek0 - Je les ai juste tapés dans Firebug. – nickf

+0

Merci ça fonctionne comme un charme. Maintenant, je dois passer par votre code pour comprendre la raison. Merci encore –

2

En supposant que vous voulez une liste d'entiers: (\d+)

La virgule et ne doivent pas être espacements un problème, puisque vous ne devez aller sur les groupes.

+0

Je pense qu'il veut valider une entrée. – nickf

+0

Désolé je ne pourrais pas exprimer clairement ma question, je veux valider une expression comme "12, 3455" ou "4456,888, 23343" etc. votre solution accepte juste des nombres. Merci pour la réponse quand même –

0

Je ne sais pas ce que vous entendez avec le champ

n'est pas nécessaire que signifie qu'il pourrait être vide

De plus, je pense que ce travail sould

/^((\b)*[0-9]+(\b)*[,])*(\b)*[0-9]+(\b)$/ 
+0

vous devez vérifier le début et la fin de la chaîne. Celui-ci retourne vrai pour "123, bonjour" – nickf

+0

J'ai corrigé ma réponse – eKek0

0

Cette question devrait être plus précis: par exemple, acceptez-vous les espaces entre les chiffres? acceptez-vous la virgule au début/à la fin? Acceptez-vous l'espace avant la virgule? Acceptez-vous plusieurs espaces consécutifs? Acceptez-vous des espaces au début/à la fin?

Je vais supposer ce que je pense est le plus probable, de sorte que vous n'acceptez pas les espaces entre les chiffres, vous n'acceptez pas la virgule au début/fin, mais vous acceptez l'espace avant et après la virgule espaces et vous acceptez les espaces au début/à la fin.

/^ *([0-9]+(*, *[0-9]+)*)? *$/ 
  • "": true
  • "   ": true
  • "123": true
  • "123,45": true
  • "123, 45, 67" : true
  • "  123": true
  • « 3" : false
  • », 45" : false
  • "123,": false

La clé lors de l'écriture regex pour correspondre à une liste d'éléments "E" délimitée par un séparateur "S" c'est que vous devrez écrire deux fois le "E" matcher (ici c'est simplement "[0-9] +").

  • le principe de la tendance est E (SE) *
  • E est "[0-9] +": simplement une séquence de chiffres
  • S "*, *" (notez les espaces): une virgule avec des espaces avant et après optionnels

à ce stade, nous avons:

/^[0-9]+(*, *[0-9]+)*$/ 

nous un peu il améliore, il accepte également des espaces en début/fin, s Paces seulement et des chaînes vides:

/^ *([0-9]+(*, *[0-9]+)*)? *$/ 

Remarque Personnellement, je préfère utiliser [0-9] au lieu de \ d, je pense qu'il est moins déroutant de lire.

Questions connexes