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

时间:2015-12-07 22:41:17

标签: javascript

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

(2*34)+96/2*6-98之类的东西 而不是像4*(2*aggw*^^)*as.,,;

这样的非法字符串

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

2 个答案:

答案 0 :(得分:1)

我设置了一个检查以下内容的函数:

  • 无效的相邻字符对,例如*^-)+/,同时允许其他未指定的组合(例如((--+(-(
  • 括号不正确,无论是打开vs关闭的错误数字,还是没有相应开放括号的右括号。
  • 指定的允许运营商之间的非数字或无限(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>

答案 1 :(得分:0)

您可以在javascript中使用正则表达式来执行此操作: 例如:

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));

您可以找到更好的匹配正则表达式。我找到了这个here