He leído otras publicaciones de stackoverflow sobre una expresión regular de expresión aritmética simple, pero ninguna de ellas funciona con mi problema:
Necesito validar este tipo de expresión: "12+5.6-3.51-1.06" ,
Lo intenté
const mathre = /(\d+(.)?\d*)([+-])?(\d+(.)?\d*)*/; console.log("12+5.6-3.51-1.06".match(mathre)); pero el resultado es '12+5' , y no puedo entender por qué.
Solo obtiene 12.5 como coincidencia, ya que no hay una bandera global /g , pero si habilita la bandera global, dará coincidencias parciales ya que no hay anclas ^ y $ en el patrón que valida toda la cadena.
El [+-] solo coincide una vez, lo que debe repetirse para que coincida varias veces.
Actualmente, el patrón coincidirá con 1+2+3 , pero también coincidirá con 1a1+2b2 , ya que el punto no se escapa y puede coincidir con cualquier carácter (use \. para que coincida literalmente).
Para comenzar con dígitos y partes decimales opcionales y repetir 1 o más veces un + o - :
^\d+(?:\.\d+)?(?:[-+]\d+(?:\.\d+)?)+$Demostración de expresiones regulares
Si los valores pueden comenzar con más y menos opcionales y también pueden ser decimales sin dígitos iniciales:
^[+-]?\d*\.?\d+(?:[-+][+-]?\d*\.?\d+)+$^ Comienzo de cadena[+-]? Opcional + o -\d*\.\d+ Coincide con *+ dígitos con . y 1+ dígitos(?: grupo de no captura[-+] Coincide con un + o -[+-]?\d*\.\d+ Coincide con un + o - 0+ dígitos opcionales y un . y 1+ dígitos)+ Cierra el grupo de no captura y repite 1+ veces para que coincida con al menos un solo + o -$ Fin de la cadenaIntentaría usar esta solución para el motor RegExp compatible con PCRE:
^(?:(-?\d+(?:[\.,]{1}\d)?)[+-]?)*(?1)$^ Inicio de cadena(?: grupo de no captura ng1(-?\d+(?:[\.,]{1}\d)?) Patrón para dígito con o sin inicio "-" y con "." o "," en el medio, coincide con 1 o 1.1 o 1,1 (Grupo de coincidencia 1)[+-]? Patrón para "+" o "-")* Dice que el grupo ng1 podría repetirse 0 o más veces(?1) Dice que debe ser un dígito al final del patrón por referencia al primer subpatrón$ Fin de la cadenaComo JS no admite la referencia recursiva, puede usar la versión completa en su lugar:
/^(?:(-?\d+(?:[\.,]{1}\d)?)[+-]?)*(-?\d+(?:[\.,]{1}\d)?)$/gm