如何检查用户给定的字符串是否是有效的算术方程式

How do I check if a given string from a user is a valid arithmetic equation?

本文关键字:是否是 字符串 有效 方程式 何检查 检查 用户      更新时间:2023-09-26

我需要接受来自用户的字符串。

类似(2*34)+96/2*6-98而不是像4*(2*aggw*^^)*as.,,; 那样的非法字符串

我需要验证它是否是一个有效的算术方程。

我会设置一个函数来检查以下内容:

  • 无效的相邻字符对,如*^-)+/,同时允许其他未指定的组合(如((--+(-(
  • 不正确的括号,无论是开括号与闭括号的数量不正确,还是没有相应的开括号的闭括号
  • 指定的允许运算符之间的非数字或无限(Infinity关键字)值

document.querySelector("input").addEventListener("keyup", function() {
  document.getElementById("output").innerHTML = isValid(this.value);
});
function isValid(str) {
  var invalidOperatorPairs = ["**", "*/", "/*", "//", "()", "^^", "^/", "/^", "^*", "*^", "-)", "+)", "*)", "/*", "^)", "-*", "-/", "-^", "+*", "+/", "+^", "(*", "(/", "(^","/)","*)","+)","-)","^)"]
  str = "(" + str + ")";
  var open = 0;
  for (var i = 0, len = str.length; i < len; i++) {
    var curr = str[i];
    if (curr === "(") {
      open += 1;
    } else if (curr === ")") {
      open -= 1;
      if (open < 0) {
        return false
      }
    }
    if (i > 0) {
      for (var j = 0, oplen = invalidOperatorPairs.length; j < oplen; j++) {
        if (str[i - 1] == invalidOperatorPairs[j][0] && curr == invalidOperatorPairs[j][1]) {
          return false
        }
      }
    }
  }
  if (open !== 0) return false;
  var sections = str.split(/['+'-'*'/'^')'(]/g);
  for (i = 0, len = sections.length; i < len; i++) {
    if ((sections[i].length > 0) &&
      !(Number(sections[i]) !== NaN && isFinite(sections[i]))) {
      return false
    }
  }
  return true;
}
<input type="text" value="" />
<div id="output"></div>

您可以在javascript中使用regex来执行此操作:例如:

var op1= "(2*34)+96/2*6-98";
var op2 = "4*(2*aggw*^^)*as.,,;";
//Regular expression to use
var regEx = /([-+]?[0-9]*'.?[0-9]+['/'+'-'*])+([-+]?[0-9]*'.?[0-9]+)/g;
//Following will be true
alert(regEx.test(op1));
//Following will be false
alert(regEx.test(op2));

您可能会找到更好的匹配正则表达式。我在这里找到了这个。