2009-08-31 51 views
5

Estoy tratando de validar la entrada del usuario, que es solo números separados por comas. Me gustaría hacer esto con RegEx, pero no se me ocurre la expresión correcta.Regex para el número separado por comas

Se debe validar las siguientes cadenas (y más grande):

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

e invalidar las siguientes cadenas (y más loco):

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

Cualquier ayuda sería muy apreciada.

Aquí es lo que he probado hasta ahora (EDIT: que no funcionan), junto con varias variantes ->

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

Respuesta

14

¿Qué tal esto:

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

Básicamente, usted puede tener 1-3 dígitos sin comas. Después de eso, necesitas una coma. Si tiene una coma, es debe seguido de 3 dígitos más. Esa secuencia de coma-3 dígitos puede aparecer cualquier cantidad de veces.

EDIT: Como observó Andrew Hare, que no se preocupan por lo que se encontró dentro de los paréntesis más allá del hecho de que coincide, por lo que puede utilizar un grupo no captura en su lugar mediante la colocación de ?: después del paréntesis de apertura:

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

+1 Muy bien hecho. Mi única crítica: dado que esta expresión regular es solo para validación, debe cambiar ese grupo de captura para que sea un grupo sin captura. –

+2

Buen punto, pero siempre me ha molestado que hacer un grupo sin captura hace que la expresión regular sea más fea. –

+0

mirando la expresión original que parece iluminada, una cadena como 12,1,123 es legal ((\ d {1,3},) * \ d {3}) que lo anterior no satisface –

Cuestiones relacionadas