计算器中的正则表达式错误答案

时间:2013-04-20 18:47:41

标签: ruby regex calculator

下面的代码是一个计算器脚本,我可以针对数学表达式运行。输出显然是错误的。我认为它是无限循环的。如果有人能在这里找到错误,我会非常感激。

我无法在我的解决方案中使用eval。你在这里看到的一般格式是我必须使用的。我也99%确定我也不能使用case语句。

守则

expression = (ARGV[0]).gsub(/\s/, '')
def theCalculator (expression)
  while expression =~ /\D/
    if expression =~ /\(.*\)/
        expression = expression.scan(/\((.*)\)/)
        expression = $` + (theCalculator(expression)).to_s + $'
    elsif expression =~ /\^/
        expression = expression.scan(/(\d*|\d*\.\d*)(\^)(\d*|\d*\.\d*)/)
        expression = $1.to_f ** $3.to_f
        expression = $` + expression.to_s + $'
    elsif expression =~ /\*|\//
        expression = expression.scan(/(\d*|\d*\.\d*)(\*|\/)(\d*|\d*\.\d*)/)
        if $2 == "*"
          expression = $1.to_f * $3.to_f
        else
          expression = $1.to_f / $3.to_f
        end
      expression = $` + expression.to_s + $'
    elsif expression =~ /\+|\-/
      expression = expression.scan(/(\d*|\d*\.\d*)(\+|\-)(\d*|\d*\.\d*)/)
        if $2 == "+"
          expression = $1.to_f + $3.to_f
        else
          expression = $1.to_f - $3.to_f
        end
      expression = $` + expression.to_s + $'
    end
end
return expression
end
expression = theCalculator(expression)
puts expression

输入

ruby calc.rb "2 ^ (4 - 1.0) + 1"

输出

(big ol infinite loop)

1 个答案:

答案 0 :(得分:1)

一个好的起点是resource on regex。如果您觉得有必要以这种方式进行实验,也知道有几个在线正则表达式评估者。

提供几个非常重要的提示,这些提示可以让您更接近自己完成作业:

  • 找到调试代码的方法!您已经知道puts,您可以使用它来开始
  • 仔细查看while条件(\D):我认为[^\d.]更好
  • 此外,我认为[*\/][+-]可以分别替换\*|\/\+|\-
  • 在您的递归通话中,我将.to_s添加到expression
  • 的结果会更好
  • 注意贪婪:使用 lazy 量词进行parens比赛
    修改:使用表达式匹配没有任何内在的parens ......
  • \d*|\d*\.\d*\d*(?:\.\d*)?
  • 不同

请仔细查看上面的列表并尝试了解我的建议 你能让你的脚本给出与我相同的结果吗? (9.0