Necesito hacer coincidir un patrón para la validación. Quiero hacer coincidir un número decimal donde la parte numérica puede tener hasta 14 dígitos, incluidos + o - sin 0 y después del decimal tiene hasta 4 dígitos. Los patrones válidos son:
+1.23 9857.6543 -745290.0Los patrones no válidos son:
0 0.00 1.23456 He probado ^[0-9]{0,14}\.[0-9]{0,4}$ . No entiendo cómo hacer coincidir las condiciones + , - y 0
Respuesta corta: ^[+-]?[1-9][0-9]{0,13}\.[0-9]{1,4}$
^ - comienzo de la cadena
[+-]? opcionalmente, uno entre + y -
[1-9][0-9]{0,13} : un número de 14 dígitos que no empieza por 0
\. - separador decimal, tiene que escaparse o significará "cualquier carácter"
[0-9]{1,4} - hasta 4 dígitos decimales
$ - final de la cadena
El patrón:
^[+-]?[^\D0]\d{0,13}\.\d{1,4}(?!\d) coincide con los primeros 3 pero no con los segundos 3. [^\D0] es, si no me equivoco, estrictamente lo mismo que [123456789] , pero un poco más compacto.
Esto podría funcionar ^(\+|-)?(([1-9]|0(?=0*[1-9]))[0-9]{0,13}(\.[0-9]{1,4})?|0{1,14}\.(?=0*[1-9])[0-9]{1,4})$
^(\+|-)? - comienza con +/-(([1-9]|0(?=0*[1-9]))[0-9]{0,13}(\.[0-9]{1,4})? - valor absoluto >= 1| - o0{1,14}\.(?=0*[1-9])[0-9]{1,4} - 0.**** con al menos 1 dígito distinto de cero)$ - fin const testcases = [ '+1.23', '9857.6543', '-745290.0', '1.0', '1.00', '12', '0.01', '+001.01', '0', '0.00', '1.23456', '0.0', '12.']; const regex = /^(\+|-)?(([1-9]|0(?=0*[1-9]))[0-9]{0,13}(\.[0-9]{1,4})?|0{1,14}\.(?=0*[1-9])[0-9]{1,4})$/; testcases.forEach(n => console.log(`${n}\t - ${regex.test(n)}`));