Pregunta

Necesito hacer coincidir un número infinito de figuras en una página web.

Necesito poder hacer coincidir todos los formatos siguientes:

100 $
99$
$99
$ 8
$.99
$ .8
$ 99.8
.99$
.99 $
9.2 $
1.2$

Y el equivalente usando comas:

444,333
22,333
1,222
11,111,111
333,333,333,333.01132

O espacios:

444 333
22 333
1 222
11 111 111
333 333 333 333.01132

Esto es realmente difícil para mí. Estoy acostumbrado a jugar con expresiones regulares, pero no he podido escribir algo a prueba de balas. Por lo general, http://www.regexlib.com tiene la solución, pero no para esta.

No puedo pensar en otra forma que no sea usar regexp, ya que es una búsqueda / reemplazo de texto sin formato.

¿Fue útil?

Solución

Aquí hay una expresión regular que coincidirá con todos los formatos de números que ha proporcionado:

^(?:\$\s*)?(?:(?:\d{0,3}(?:[, ]\d{0,3})*[, ])+\d{3}|\d+)(?:\.\d*)?(?:\s*\$)?$

Para desglosarlo:

  • ^ (?: \ $ \ s *)? buscará un $ opcional al comienzo de la cadena, seguido de cualquier cantidad de espacios
  • (?: (?: \ d {0,3} (?: [,] \ d {0,3]) * [,]) + \ d {3} | \ d *) coincidirá con un número desglosado en grupos separados por una coma o espacio ( \ d {0,3} (?: [,] \ d {0,3}) * [,]) + \ d {3} ) o una cadena de números ( \ d + ), por lo que 123,456,789, 123456 789 y 123456789 coincidirían. La expresión regular no aceptará números con agrupamiento incorrecto (por lo que 123,45,6789 no coincidirá)
  • (?: \. \ d *)? coincidirá con un número con un decimal opcional y cualquier número de números después de
  • (?: \ s * \ $)? $ coincidirá con un $ opcional al final de la cadena, precedido por cualquier cantidad de espacio.

Otros consejos

¿Por qué escribir 1 regexp, cuando puedes escribir varias, y aplicarlas a su vez?

Supongo (?) que puede iterar línea por línea. ¿Por qué no prueba su expresión regular con comas, seguida de su expresión con conocimientos de espacio, etc.? Si coincide, no se moleste en probar el resto, almacene su resultado y pase a la siguiente línea.

¿qué hay de hacer esto en 2 pasos?

primero reemplaza todos los espacios con ''

entonces, si el formato de número es siempre el mismo, puede reemplazar las comas con ''

después de eso, es bastante fácil, ¿no?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top