给定一个字符串
7 1/3 inches - 4.12mm
将混合数字(7 1/3)与建立下面的订单操作相关联的最佳方法是什么?
((7 1/3) inches) - (4.12 millimeters) = 7.17112861 inches
我的第一次尝试是将字符串与运算符(+, - ,*,/,%)分开,但显然不符合理性要求。操作顺序是关键,但我对如何通过代码实现这一点感到迷茫。
答案 0 :(得分:1)
我认为你真的需要使用定义语法来查看正确的解析器。类似于lex / yacc解决方案。我并不熟悉ruby,但似乎有一些ruby实现
http://www.ruby-doc.org/stdlib-2.1.0/libdoc/racc/parser/rdoc/Racc.html http://i.loveruby.net/en/projects/racc/doc/
您可以将空格视为与添加功能相同的运算符。除了标准数学运算符的规则之外,您可能还有
exp:exp''exp {result = val [0] + val 1} | exp'+'exp {result = val [0] + val 1} | exp' - 'exp {result = val [0] - val 1} | exp'*'exp {result = val [0] * val 1} | exp'/'exp {result = val [0] / val 1}
您需要添加优先规则和规则来处理计量单位。
另一种方法是实现一个可以解析数学表达式的Shunting-yard algorithm。
答案 1 :(得分:0)
为了在不丢失顺序的情况下将字符串拆分为其部分,您可以执行以下操作:
s = '7 1/3 inches - 4.12mm'
s.split(/(?: |(?:(?<=\d)(?=[a-z]))|(?:(?<=[a-z])(?=\d)))/)
# => ["7", "1/3", "inches", "-", "4.12", "mm"]
此代码在空格和数字与字母之间的边界上分割。
现在你所要做的只是lex数组,并计算你的结果