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がここに書いたように-他の回答も見ることができます)
I'm assuming you don't want to use eval because of security reasons, and it is indeed very hard to properly sanitize input for eval, but for simple mathematical expressions perhaps you could just check that it only includes mathematical operators and numbers?
mathstring = "3+3"
puts mathstring[/\A[\d+\-*\/=. ]+\z/] ? eval(mathstring) : "Invalid expression"
=> 6
You have 3 options:
Fastest, but dangerous and by calling eval
but not Kernel#eval
RubyVM::InstructionSequence.new(mathstring).eval
Sure--you'd just want to somehow parse the expression using something other than the bare Ruby interpreter.
There appear to be some good options here: https://www.ruby-toolbox.com/search?q=math
Alternatively, it probably wouldn't be that hard to write your own parser. (Not that I've seriously tried--I could be totally full of crap.)
Dentakuは (私はまだ使用していませんが) 良い解決策のように思えます - (数学的および論理的な) 式をチェックし、それらを評価することができます。
calculator = Dentaku::Calculator.new
calculator.evaluate('kiwi + 5', kiwi: 2)