【问题标题】:Variable name and restrict operators in math.jsmath.js 中的变量名和限制运算符
【发布时间】:2014-10-28 08:32:34
【问题描述】:

我正在使用math.js 来验证数学方程是否缺少右括号或重复的运算符等,因此以下将被视为不正确的方程:

9 + ((5 * 6)//12

这很好用。但是我想要做的是允许在等式中使用变量名,如下所示:

9 + (variableName * 6) / 12

变量名也应该相同。因此,验证器需要知道如果在表达式中找到“variableName”就可以了。

我还想将允许的方程运算符限制为以下内容:

()-+/*

我试图在文档中找到这些问题的答案,但没有成功。

有人知道 math.js 是如何做到的吗?

【问题讨论】:

  • 你不需要使用math.js来评估9 + (variableName * 6) / 12这样的表达式
  • @hindmost:愿意提供替代方案吗? OP 并不试图计算结果。他正在验证表达式。
  • 那么,您将如何验证输入?确保没有未闭合的括号或有重复的运算符?

标签: javascript jquery math


【解决方案1】:

您可以使用 math.js 将表达式解析为节点树:

var tree = math.parse('9 + (variableName * 6) / 12');

使用当前版本的 math.js,您可以使用函数 find 分析树(未记录,请参阅 explanation here)。下一个版本的 math.js 将以函数 traversetransform 的形式提供更广泛(并记录在案)的支持,这使您可以轻松地遍历树中的所有节点并执行某些操作。

使用这些函数,您可以例如查找所有 SymbolNode 并检查它们是否被允许,并查找所有 OperatorNode 并检查它们是否被允许。我为您创建了一个 jsbin 来演示如何分析已解析的表达式:

http://jsbin.com/duduru/1/edit?html,output

或者,您可以使用PEG.jsJison 生成自己的解析器。

编辑:math.js 的最新版本现在正式支持对表达式树的操作,请参阅文档:http://mathjs.org/docs/expressions/expression_trees.html

【讨论】:

  • 感谢您的帮助,这真的很有帮助!但是,以下表达式作为有效的传递,但它不是有效的数学表达式:var expression = '9 ++++-- + 12';
  • 嗯,它是有效的,但在实践中不是很有用:一系列一元的优缺点(9 + -129 - -12 仍然有意义)。如果您不想允许这样做,您可以为此添加另一个测试...
猜你喜欢
  • 1970-01-01
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多