使用javascript中的数学方程式拆分变量

Split a variable using mathematical equations in javascript

本文关键字:方程式 拆分 变量 javascript 使用      更新时间:2023-09-26

实际上我有两个问题。我想做的是首先检查用户输入的值是否是正确的数学方程。例如,如果使用输入x + y ( z,则应检测为无效公式,x + y ( z )为正确公式,

我想做的第二件事是将公式从+ - * / ()符号中分离出来,所以上面的公式将返回为x, y, z

我所做的是低于

var arr = [];
var s = 'x + y ( z )';
arr = s.split("(?<=[-+*/])|(?=[-+*/])");
console.log(arr);

这返回一个只有一个数据的数组,如[x + y ( z )]

另外,变量不是单个字母。他们可能如年度价格、收盘价等

有人能帮我解决这个问题吗。提前感谢

更新:我也尝试过"/[^+/*()-]+/g"

对于第二部分:

var s = 'x + y ( z )';
var arr = s.match(/('w)/g);
console.log(arr);
document.write(JSON.stringify(arr));

当然,您必须首先检查输入的有效性。

编辑:使用Tomer W的答案建议eval():

function checkExpression(str) {
    // check for allowed characters only
    if (/[^'w'd'(')'+'*'/'-'s]/.exec(s) != null)
        return false;
    // extract variable names, assuming they're all one letter only
    var arr = s.match(/('w+)/g);
    // instantiate the variables
    arr.forEach(function (variable) {
        eval(variable + '= 1');
    });
    // ( is alone, replace it by * (
    str = str.replace(/'(/g, '* (');
    try {
        eval(str);
        return true;
    }
    catch (ex) {
        console.log(ex);
        return false;
    }
}

它很脏,但大多数时候都能工作(Tomer W指出了一些边缘情况,如++62+554++++6,可以通过另一个正则表达式检查来避免),你有更复杂的例子要测试吗?

警告语

前方有非常非常危险的方法!!!

我发布这个是因为这是一个有效的答案,但你应该非常小心,因为用户可能会完全破坏你的网站
不要让一个用户输入在eval中用于另一个用户!!!永远

实际答案

您可以使用浏览器内置的java脚本编译器,并使用eval()

function checkEq(equ)
{
  for(ch in equ){
    // check that all characters in input are "equasion usable"
    if(" +-*/1234567890e^&%!=".indexOf(ch) === -1)
    { // if there are invalid chars
      return false;
    }
  }
  try{
    // try running the equ, will throw an exception on a syntax error.
    eval(equ);
    return true; // no exception
  }
  catch(ex){
    return false; // syntax error
  }
}

Plunker示例

正如我之前所指出的!极度小心!

使用@ShanShan和@Tomer W的答案,我编写了一个公式验证器。代码如下。在这个验证器中,我检查打开和关闭括号、额外的/*-+符号、不需要的符号等。

如果用户希望创建并验证具有x、y、z的公式变量,用户必须将变量添加到数组中并将其传递给该验证器编写了公式,以便验证器接受不是数字的变量。

我还使用了本文中提到的自定义集。https://stackoverflow.com/a/4344227/918277

重要提示:此java脚本函数无法验证sin、cos、tan、log等非常复杂的公式。脚本会将它们识别为字母,并返回false

function StringSet() {
    var setObj = {}, val = {};
    this.add = function(str) {
        setObj[str] = val;
    };
    this.contains = function(str) {
        return setObj[str] === val;
    };
    this.remove = function(str) {
        delete setObj[str];
    };
    this.values = function() {
        var values = [];
        for ( var i in setObj) {
            if (setObj[i] === val) {
                values.push(i);
            }
        }
        return values;
    };
}
/**
 * 
 * @param _formulaInputs
 *            Array of use entered inputs to be use in formula
 * @param _formula
 *            User entered formula
 * @returns {Boolean}
 */
function validateFormula(_formulaInputs, _formula) {
    var formula = _formula;
    var bracketStack = new Array();
    var formulaDescArray = [];
    var formulaDescInForm = new StringSet();
    for (var i = 0; i < _formulaInputs.length; i++) {
        formulaDescInForm.add(_formulaInputs[i]);
    }
    /* Regex to check for unwanted symbols(! @ # $ etc.) */
    if (/[^'w'd'(')'+'*'/'-'s]/.exec(formula) != null) {
        return false;
    }
   for (var i = 0; i < _formula.length; i++) {
            if ((_formula.charAt(i) == '/' || _formula.charAt(i) == '*'
                    || _formula.charAt(i) == '-' || _formula.charAt(i) ==   '+')
                    && (_formula.charAt(i + 1) == '/'
                            || _formula.charAt(i + 1) == '*'
                            || _formula.charAt(i + 1) == '-' || _formula
                            .charAt(i + 1) == '+')) {
                return false;
            }
    }
    var lastChar = formula.charAt(formula.length - 1);
    if (lastChar == '/' || lastChar == '*' || lastChar == '-'
            || lastChar == '+') {
        return false;
    }
    formulaDescArray = formula.split(/['/'*'-'+'()]/g);
    /* Remove unwanted "" */
    for (var i = 0; i < formulaDescArray.length; i++) {
        if (formulaDescArray[i].trim().length == 0) {
            formulaDescArray.splice(i, 1);
            i--;
        }
    }
    /* Remove unwanted numbers */
    for (var i = 0; i < formulaDescArray.length; i++) {
        if (!isNaN(formulaDescArray[i])) {
            formulaDescArray.splice(i, 1);
            i--;
        }
    }
    for (var i = 0; i < formulaDescArray.length; i++) {
        if (!formulaDescInForm.contains(formulaDescArray[i].trim())) {
            return false;
        }
    }
    for (var i = 0; i < formula.length; i++) {
        if (formula.charAt(i) == '(') {
            bracketStack.push(formula.charAt(i));
        } else if (formula.charAt(i) == ')') {
            bracketStack.pop();
        }
    }
    if (bracketStack.length != 0) {
        return false;
    }
    return true;
}