首页 > 解决方案 > JavaScript 正则表达式匹配数学表达式

问题描述

我需要这个正则表达式的帮助:

let j = numberArray.join("").match(/^([\d]*\.{1,}[\d]+|[\d]+)|([-+*/](?=\.|[\d]))|\.[\d]+|[\d]+/g);

这是我需要匹配的标准:

  1. 一个数字不能有多个小数。例如,只允许使用.123or等​​数字1.123,但不允许使用...33or 1.2.3.3
  2. 一个运算符后面不能有一个或多个附加运算符。因此,用户不能连续输入 a+后跟 a *

此处输入和输出示例:

输入:..123+*/.4.3.5-+..3+123

将产生输出:.123/.435+.3+123

我实际上认为我已经设置了第二个标准(关于运营商),但我一直在努力解决小数点问题。我是正则表达式的新手,正在尽我所能破解这个,但现在它开始影响我了。任何帮助深表感谢!

标签: javascriptregex

解决方案


如果您单独执行这些操作,逻辑可能会更容易- 首先查找具有多个小数的数字,并修复它们以使其仅包含第一个小数位,然后找到重复的运算符,并用最终运算符替换它们:

const clean = str => str
  // Match zero or more digits, followed by a decimal,
  // followed by more digit and decimal characters
  // For everything past the first decimal, replace decimals with the empty string
  .replace(
    /(\d*\.)([\d.]+)/g,
    (_, g1, g2) => g1 + g2.replace(/\./g, '')
  )
  // Match 2 or more operators, capture the last operator in a group
  // Replace with the last operator captured
  .replace(
    /([-+/*]){2,}/g,
    '$1'
  );
  
console.log(clean('..123+*/.4.3.5-+..3+123'));


推荐阅读