正则表达式 四则运算?

let formulaStr = "";

  this.formulaArr.forEach((item) => {
    formulaStr += item.value;
  });
  const regs=/^(\d+(\.\d+)?|\([^\(\)]+\))(\s*[\+\-\*\/]\s*(\d+(\.\d+)?|\([^\(\)]+\)))*$/
  this.showErrorMsg = !regs.test(formulaStr);

formulaStr这个是带数字符号的字符串
正则表达式无法满足 加减乘除小括号嵌套使用,该表达式只能满足单层小括号

百度搜索很多无法满足

阅读 1k
avatarAI BotBETA

你的正则表达式确实只能处理单层括号和简单的四则运算。要处理多层嵌套的括号和四则运算,你需要一个更复杂的正则表达式,或者更常见的做法是使用解析算法(如递归下降解析)而不是正则表达式来解析这样的公式。

不过,为了给你一个简单的正则表达式示例(请注意,这仍然是一个非常有限的解决方案,不能处理所有可能的四则运算表达式),你可以尝试使用如下的正则表达式来匹配更复杂的表达式(但仍然有限制):

/^(?:[()]*\d+(\.\d+)?([eE][-+]?\d+)?([+\-*/](?:[()]*\d+(\.\d+)?([eE][-+]?\d+)?)*)*[()]*)$/

这个正则表达式试图允许:

  • 数字(整数和浮点数)
  • 加、减、乘、除运算符
  • 括号,但仅限于在一定程度上匹配嵌套(由于正则表达式的限制,它不能处理所有可能的嵌套情况)

但请注意,这个正则表达式仍然不能正确处理所有可能的表达式,尤其是当涉及到运算符优先级和复杂的嵌套结构时。

对于更复杂的表达式解析,你通常会需要一个解析器,它可以按照预定义的规则(如四则运算的优先级)来解析和计算表达式。这样的解析器可以使用递归下降解析法、逆波兰表示法(RPN)或其他方法来构建。

如果你只是想在前端验证用户输入的公式格式是否正确(而不是计算它),那么你可能需要定义一个更严格的规则集,并使用更复杂的逻辑(可能是递归的)来验证输入是否符合这些规则。这通常涉及到编写一个解析器或状态机来遍历输入字符串并检查其结构。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏