JS利用正则表达式等 校验数学表达式是否正确

JS利用正则表达式等 校验数学表达式是否正确

项目中需求需要校验数学表达式是否正确 话不多说直接上代码

// 校验计算式
export function checkCalcExpressionValid(expression) {
  // 空字符串检查
  if (expression === "" || expression == null || !expression)
    return (expression = 0)

  // 移除空格并处理数字前的多余零,但对于小数点前的零不处理
  expression = expression
    .replace(/\s/g, "")
    .replace(/(^|[^.\d])0+(?=\d)/g, "$1")

  // 检查非法字符(只允许数字、括号、加减乘除运算符和小数点)
  if (/[^0-9+\-*/().]/.test(expression)) {
    return false
  }
  // 检查连续三个或更多减号
  if (/---+/.test(expression)) {
    return false
  }
  // 替换所有连续的两个减号为单个加号
  expression = expression.replace(/--/g, "+")
  // 检查非法字符(包括英文字母、逗号)、连续运算符(除了减号)、错误的括号或运算符位置,以及运算符后跟等号的情况
  if (
    /[a-zA-Z,]|[\+\*\/]{2,}|[\+\-\*\/]=|[\(\)\[\]]{2}|[\+\*\/\.]\)|\([\+\*\/]|[\+\*\/\.]\[|\][\+\*\/\.]|^[\+\*\/\.]|[\+\*\/\.]$/.test(
      expression
    )
  ) {
    return false
  }
  // 检查数字后直接跟左括号,或右括号后直接跟数字的情况(隐式乘法)
  if (/\d\(|\)\d/.test(expression)) {
    return false
  }
  // 检查括号是否配对
  let brackets = { "(": ")", "[": "]" }
  let stack = []
  for (let char of expression) {
    if (brackets[char]) {
      stack.push(brackets[char])
    } else if (char === ")" || char === "]") {
      if (stack.pop() !== char) {
        return false
      }
    }
  }
  if (stack.length > 0) {
    return false
  }
  // 检查数字格式(例如避免多个连续的小数点)
  if (/(\.\d*){2,}/.test(expression)) {
    return false
  }
  // 防止单个运算符
  if (/^[+\-*/.]$/.test(expression) === true) {
    return false
  }

  return expression
}

可能有遗漏或者不足 欢迎大佬评论区指教补充

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值