如何在不使用eval的情况下评估数学字符串?
示例:
mathstring = "3+3"
无论如何可以在不使用eval的情况下进行评估?
也许有正则表达式的东西..?
答案 0 :(得分:7)
您必须或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 - 你也可以看看其他答案)
答案 1 :(得分:2)
我假设您不想因为安全原因而使用eval,并且确实很难正确清理eval的输入,但是对于简单的数学表达式,也许您可以检查它只包含数学运算符和号码?
mathstring = "3+3"
puts mathstring[/\A[\d+\-*\/=. ]+\z/] ? eval(mathstring) : "Invalid expression"
=> 6
答案 2 :(得分:1)
您有3个选项:
最快,但危险并致电eval
但不是Kernel#eval
RubyVM::InstructionSequence.new(mathstring).eval
答案 3 :(得分:0)
当然 - 你只是想用某种方式解析表达式,而不是使用裸露的Ruby解释器。
这里似乎有一些不错的选择:https://www.ruby-toolbox.com/search?q=math
或者,它可能不会 很难编写自己的解析器。 (不是我认真尝试过 - 我可能完全充满了废话。)
答案 4 :(得分:0)
Dentaku似乎(我还没有使用它)就像一个很好的解决方案 - 它可以让你检查你的(数学和逻辑)表达式,并评估它们。
calculator = Dentaku::Calculator.new
calculator.evaluate('kiwi + 5', kiwi: 2)