¿Por qué mi function de testing de javascript para expresiones regulares no funciona?

Tengo una function de Javascript que testing una expresión regular que tengo la intención de validar los decimales positivos hasta una precisión de dos:

function isPositiveDecimalPrecisionTwo(str) { return /^\d*(\.\d{1,2}$)?/.test(str); } 

No obtengo los resultados que espero cuando lo llamo desde el código.

Por ejemplo:

 var a = isPositiveDecimalPrecisionTwo("1"); // expect t, returns t var b = isPositiveDecimalPrecisionTwo("1.2"); // expect t, returns t var c = isPositiveDecimalPrecisionTwo("1.25"); // expect t, returns t var d = isPositiveDecimalPrecisionTwo("1.257"); // * expect f, returns t * var e = isPositiveDecimalPrecisionTwo("1.2575"); // * expect f, returns t * var f = isPositiveDecimalPrecisionTwo(".25"); // * expect t, returns f * var g = isPositiveDecimalPrecisionTwo("d"); // expect f, returns f var h = isPositiveDecimalPrecisionTwo("d1"); // expect f, returns f var i = isPositiveDecimalPrecisionTwo("1d"); // * expect f, returns t * var j = isPositiveDecimalPrecisionTwo("1d1"); // * expect f, returns t * var k = isPositiveDecimalPrecisionTwo("-1"); // expect f, returns f var l = isPositiveDecimalPrecisionTwo("-1.5"); // expect f, returns f 

Hay tres problemas:

  1. La validation de "1.257" o "1.2575" devuelve verdadero, que pensé que devolvería falso debido a la \d{1,2}
  2. Validar ".25" devuelve falso, que pensé que volvería verdadero debido a ^\d*
  3. Validar "1d" o "1d1" devuelve verdadero. Parece que \. está leyendo como cualquier personaje cuando me parece que se escapó correctamente ". (punto).

Sin embargo, cuando uso una herramienta como regexpal.com, la misma expresión regular parece estar validando la forma en que espero:

http://regexpal.com/?flags=g&regex=%5E%5Cd%2B(%5C.%5Cd%7B1%2C2%7D%24)%3F&input=

¿Qué me estoy perdiendo?

2 Solutions collect form web for “¿Por qué mi function de testing de javascript para expresiones regulares no funciona?”

El problema es que tu $ está dentro del paréntesis. Quieres que sea después del grupo.

 /^\d*(\.\d{1,2})?$/ 

Esto debería funcionar de la manera esperada.

Con el $ inside, coincidía con todo lo que comenzó con un número, ya que el final de la cadena ( $ ) era "opcional".

También puede hacerlo sin agrupar la porción decimal simplemente agregando un ? después del punto decimal escapado

 ^\d*\.?\d{1,2}$ 
  • regexp para verificar si la input es solo numbers integers (int), y para verificar si otra es solo numbers con 2 decimales
  • Javascript coincide y reemplace con unicode
  • Reemplazar el uso incorrecto de "a" y "an" en el ingreso de text
  • Encontrar cadena entre dos cadenas en JavaScript o jQuery
  • ¿Cómo eliminar URL de una cadena completamente en Javascript?
  • Meteor, problemas con la expresión regular en mongodb
  • javascript - reemplace dash (guión) con un espacio
  • javascript regexp replace no funciona, pero el reemploop de cadenas funciona
  • Regex para validar dinero brasileño usando Javascript
  • Javascript Regex - sanitize cadena con list blanca
  • Expresión regular de JavaScript: eliminar la primera y última barra
  • Javascript tiene muchos buenos JS marco (como Node.js AngularJS Vue.js React.js) es el mejor lenguaje de script.