2010-07-07 18 views
6

¿Alguien podría proporcionarme la expresión regular para los siguientes patrones?Expresión regular para unir cantidades en dólares

$ 1234

$ 31234,3

$ 1234,56

$ 123456,78

$ .99

Mi requisito es la dígitos antes decimal no debe superar los 6 y después de la coma decimal no debe excede 2 dígitos. Por favor, ayúdame. Gracias de antemano ..

+0

Creo que hay atajos/alias de expresiones regulares para los dígitos decimales, por lo que todas estas sugerencias que contengan [0-9] podrían reemplazarse por esas. –

+2

Es cierto y definitivamente vale la pena señalarlo. Siempre me gusta usar más explícitos si la forma larga no es mucho más que los accesos directos. Para cosas como el espacio en blanco es molesto escribirlo en su totalidad, para los de tipo alfanumérico me parece que son más fáciles de leer para las personas menos acostumbradas a expresiones regulares (y por lo tanto los accesos directos de clase de caracteres). – Chris

+0

No hay importes en dólares negativos, por ejemplo, reembolsos? –

Respuesta

9
^\$(?=.*\d)\d{0,6}(\.\d{1,2})?$ 

(?=.*\d) se asegura de que hay al menos un dígito en la cadena. Sin eso, la expresión regular ^\$\d{0,6}(\.\d{1,2})?$ coincidiría con la cadena $.

Por cierto, la búsqueda no tiene por qué ser tan larga; incluso un simple (?=.) haría, ya que la expresión regular se asegura de que los caracteres subsiguientes sean efectivamente válidos. Por lo tanto, se puede simplificar a

^\$(?=.)\d{0,6}(\.\d{1,2})?$ 
+1

¿Cuál es el beneficio de usar (? =. */D) más/d {1,6} en la primera coincidencia decimal? Siento que me falta algo aquí. – Lazarus

+1

@Lazarus '\ d {1,6}' requiere al menos un dígito antes del punto decimal - no coincidirá con '$ .99' – Amarghosh

+0

Buen punto, lindo :) Gracias por eso. – Lazarus

4
^\$[0-9]{0,6}(\.[0-9]{1,2})?$ 
+0

tendrá que escapar de ese punto decimal, ahora coincidirá con cualquier cosa. –

+0

Buen punto. Gracias. Es increíble cuántas veces lo hago y cómo nunca me doy cuenta porque, por supuesto, coincide con un punto ... ;-) – Chris

+0

¿No te olvidas de escapar de otra cosa también? @Hans – Amarghosh

1
/^\$([0-9]{0-6})|^\$([0-9]{0-6})+\.([0-9]{0-2})$|\$\.([0-9]{0-2})$/ 
2

El patrón sería:

^\$\d{0,6}(\.\d{0,2})?$ 

Esto no comprueba si hay algún modo dígitos "$". es una coincidencia válida y un resultado válido dados los requisitos originales del cuestionario.

Para explicar:

^ medios solamente con la regla si no hay nada antes de la cadena que estoy buscando, es decir, "USD $ 123.45" fallaría en este ejemplo como el $ (emparejado con el \$) no es inmediatamente después del comienzo de la cadena.

\$ coincide con $ character, el uso de la barra diagonal inversa() se llama escaping y se utiliza para permitir coincidir caracteres reservados (que significan algo en el contexto de la expresión regular) en este caso $ que significa coinciden con final de la cadena, es decir, no hay caracteres después de este punto

\d coincidirá con cualquier carácter decimal, es decir 0-9

{n,m} coincidirá con el de n a m instancias del elemento precedente, si n es 0, entonces efectivamente significa que el partido es opcional.

\. coincidirá con el punto decimal, se ha escapado como. es un carácter reservado en la expresión regular que significa emparejar cualquier carácter

(...) trae la expresión regular incluida en conjunto como un grupo, hay otras consecuencias pero te dejo explorar.En este caso, es puramente para beneficio del siguiente carácter en la expresión regular

? coincidirá con 0 o 1 del elemento anterior (en este caso, el grupo que busca un punto decimal y hasta 2 caracteres decimales, así que esperamos que no haya punto decimal con caracteres finales (0 ocurrencias) o un punto decimal con hasta 2 caracteres decimales (1 aparición))

$ coincide con el final de la cadena, no puede haber caracteres en el cadena después de este punto.

+0

no coincide con el último ejemplo de OP – Amarghosh

+0

@Amarghosh, modificado. – Lazarus

Cuestiones relacionadas