【发布时间】:2016-03-15 05:44:50
【问题描述】:
如何在不使用 eval 的情况下计算数学字符串?
例子:
mathstring = "3+3"
不使用 eval 就可以求值吗?
也许有一些正则表达式..?
【问题讨论】:
如何在不使用 eval 的情况下计算数学字符串?
例子:
mathstring = "3+3"
不使用 eval 就可以求值吗?
也许有一些正则表达式..?
【问题讨论】:
你必须要么eval它,要么解析它;既然你不想eval:
mathstring = '3+3'
i, op, j = mathstring.scan(/(\d+)([+\-*\/])(\d+)/)[0] #=> ["3", "+", "3"]
i.to_i.send op, j.to_i #=> 6
如果你想实现更复杂的东西,你可以使用RubyParser(正如@LBg 写的here - 你也可以看看其他答案)
【讨论】:
我假设您出于安全原因不想使用 eval,并且确实很难正确清理 eval 的输入,但是对于简单的数学表达式,也许您可以检查它是否仅包含数学运算符和数字?
mathstring = "3+3"
puts mathstring[/\A[\d+\-*\/=. ]+\z/] ? eval(mathstring) : "Invalid expression"
=> 6
【讨论】:
您有 3 个选项:
最快,但很危险,通过调用eval 而不是Kernel#eval
RubyVM::InstructionSequence.new(mathstring).eval
【讨论】:
当然——你只是想以某种方式使用裸露的 Ruby 解释器以外的东西来解析表达式。
这里似乎有一些不错的选择:https://www.ruby-toolbox.com/search?q=math
另外,编写自己的解析器可能不会那么困难。 (我没有认真尝试过——我可能完全是废话。)
【讨论】:
Dentaku 似乎(我还没有使用它)是一个很好的解决方案——它可以让你检查你的(数学和逻辑)表达式,并评估它们。
calculator = Dentaku::Calculator.new
calculator.evaluate('kiwi + 5', kiwi: 2)
【讨论】: