¿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}$ 
  • Averigüe si una cadena está compuesta con un cierto set de caracteres
  • Javascript RegEx para unir palabras sin guiones anteriores o posteriores
  • Convierta JavaScript Regex a C #
  • typeof para RegExp
  • Compruebe si una cadena comienza con una letra seguida de un dígito y luego cualquier carácter
  • expresión regular de javascript para verificar las direcciones IP
  • Javascript regex split rechaza nulo
  • Regex para unir palabras parciales (JavaScript)
  • Javascript Regex: ¿qué usar para validar un número de teléfono?
  • javascript find protocol, domain, más primera barra con regexp desde una label src, reemplace con cadena vacía
  • ¿Cómo escaping de los caracteres especiales de expresiones regulares usando javascript?
  • Javascript tiene muchos buenos JS marco (como Node.js AngularJS Vue.js React.js) es el mejor lenguaje de script.